예제 #1
0
파일: main_cpu.cpp 프로젝트: JAGJ10/Snow
int main(void)
{
    float a11, a12, a13, a21, a22, a23, a31, a32, a33;

    a11= -0.558253; a12 = -0.0461681; a13 = -0.505735;
    a21 = -0.411397; a22 = 0.0365854; a23 = 0.199707;
    a31 = 0.285389; a32 =-0.313789; a33 = 0.200189;

    // printf("Original Matrix:\n");
    // printMat3(a11, a12, a13, a21, a22, a23, a31, a32, a33);

    float u11, u12, u13, u21, u22, u23, u31, u32, u33;
    float s11, s12, s13, s21, s22, s23, s31, s32, s33;
    float v11, v12, v13, v21, v22, v23, v31, v32, v33;

    clock_t start, end;
    start = clock();
    for (int i=0; i<1e6; i++)
    {
        svd(a11, a12, a13, a21, a22, a23, a31, a32, a33,
        u11, u12, u13, u21, u22, u23, u31, u32, u33,
        s11, s12, s13, s21, s22, s23, s31, s32, s33,
        v11, v12, v13, v21, v22, v23, v31, v32, v33);
    }    
    end = clock();

    printf("Average SVD takes %f microseconds \n ", 1e6*(double(end - start) / 1e6 / CLOCKS_PER_SEC ) );
    
    printf("U:\n");
    printMat3(u11, u12, u13, u21, u22, u23, u31, u32, u33);
    printf("S:\n");
    printMat3(s11, s12, s13, s21, s22, s23, s31, s32, s33);
    printf("V:\n");
    printMat3(v11, v12, v13, v21, v22, v23, v31, v32, v33);

    float t11, t12, t13, t21, t22, t23, t31, t32, t33;
    multAB(u11, u12, u13, u21, u22, u23, u31, u32, u33,
           s11, s12, s13, s21, s22, s23, s31, s32, s33,
           t11, t12, t13, t21, t22, t23, t31, t32, t33);

    float m11, m12, m13, m21, m22, m23, m31, m32, m33;
    multAB(t11, t12, t13, t21, t22, t23, t31, t32, t33,
           v11, v21, v31, v12, v22, v32, v13, v23, v33,
           m11, m12, m13, m21, m22, m23, m31, m32, m33);

    printf("USV* : \n");
    printMat3(m11, m12, m13, m21, m22, m23, m31, m32, m33);

    return 0;

}
예제 #2
0
void test_linalg3() {
	//compare Eigen vs. linalg3.h for 3x3 matrix addition, multiplication

	//for timing
	int n = (int) 1e9;
	timeval t0, t1;

	Mat3 A,B,C;

	setMat3(1,2,3,4,5,6,7,8,9,A);
	addcMat3(A,1,B);

	//computation time
	gettimeofday(&t0, NULL);
	for (int i=0; i<n; i++) {
		multMatMat3(A,B,C);
	}
	gettimeofday(&t1, NULL);

	//must print or compiler will optimize out loop
	std::cout << "(using linalg3) C=\n";
	printMat3(C,-1,-1);
	std::cout << "iterations: " << (Real) n << std::endl;
	std::cout << "clock (sec): " << tosec(t1)-tosec(t0) << std::endl;
	std::cout << std::endl;


	if (1) {
		//test Eigen
		Eigen::Matrix<Real,3,3> A_;
		Eigen::Matrix<Real,3,3> B_;
		Eigen::Matrix<Real,3,3> C_;

		//.data() returns a pointer to the data array of the matrix
		copyVec3ToArray(3, (Vec3*) A, A_.data());
		copyVec3ToArray(3, (Vec3*) B, B_.data());

		//std::cout << "A=\n" << A_ << std::endl;
		//std::cout << "B=\n" << B_ << std::endl;
	
		gettimeofday(&t0, NULL);
		for (int i=0; i<n; i++) { 
			//C_ = A_+B_;
			C_ = A_*B_;
		}
		gettimeofday(&t1, NULL);

		std::cout << "(using Eigen) C=\n" << C_ << std::endl;
		std::cout << "iterations: " << (Real) n << std::endl;
		std::cout << "clock (sec): " << tosec(t1)-tosec(t0) << std::endl;
		std::cout << std::endl;
	}
	
}
예제 #3
0
void test_qvelToQdot() {

	//constants
	const int nf = 5;
	const int ns = NUMSTATE(nf);
	const int nv = NUMQVEL(nf);

	Real statedot[ns];
	Real qvel[nv],qvel_cvtback[nv];
	
	VecEuler euler = {DEGTORAD(10),DEGTORAD(20),DEGTORAD(30)};
	VecOrient orient;
	Mat3 R_body_to_world;
	
	if (WMRSIM_USE_QUATERNION) 
		eulerToQuat(euler,orient);
	else 
		copyEuler(euler,orient);

	orientToRot(orient,R_body_to_world);
	for (int i=0; i<nv; i++) {
		qvel[i] = i;
	}

	qvelToQdot(nf,qvel,orient,R_body_to_world,statedot);
	qdotToQvel(nf,statedot,orient,R_body_to_world,qvel_cvtback); //convert back to check

	//PRINT
	std::cout << "orient =\n";
	printOrient(orient,-1,-1);
	std::cout << std::endl;

	std::cout << "R_body_to_world =\n";
	printMat3(R_body_to_world,-1,-1);
	std::cout << std::endl;

	std::cout << "qvel =\n";
	printMatReal(nv,1,qvel,-1,-1);
	std::cout << std::endl;

	std::cout << "statedot =\n";
	printMatReal(ns,1,statedot,-1,-1);
	std::cout << std::endl;

	std::cout << "qvel (converted back) =\n";
	printMatReal(nv,1,qvel_cvtback,-1,-1);
	std::cout << std::endl;

}
예제 #4
0
파일: main_glm.cpp 프로젝트: JAGJ10/Snow
int main()
{

    // run a simpe test
    glm::mat3 A;
    // GLM stores matrices in column-major order so this initialization is the transpose of what we want
    A = glm::mat3(   -0.558253,    -0.0461681,    -0.505735,
                   -0.411397  ,   0.0365854  ,   0.199707,
                    0.285389  ,   -0.313789  ,   0.200189);

    A = glm::transpose(A);

    std::cout << "original matrix" << std::endl;
    printMat3(A);
/// 2. Symmetric Eigenanlysis
    // normal equations matrix
    glm::mat3 S = glm::transpose(A) * A;
    // std::cout << "normal equations matrix" << std::endl;
    // printMat3(S);
    glm::quat qV;
    jacobiEigenanalysis(S,qV);
    std::cout << "final S (diagonalized) " << std::endl;
    printMat3(S);
    std::cout << "cumulative rotation quaternion" << std::endl;
    printQuat(qV);


    glm::mat3 V = glm::toMat3(qV); // normalize qV, convert it to matrix
    //std::cout << "final rot matrix V" << std::endl;
    //printMat3(V);
    glm::mat3 B = A * V; // right-multiply A with V => left multiply for column major
    std::cout << "B=AV" << std::endl;
    //printMat3(B);
///// 3. Sorting the singular values (find V)
    sortSingularValues(B,V);
    //std::cout << "sorted B=AV" << std::endl;
    //printMat3(B);
    std::cout << "sorted V" << std::endl;
    printMat3(V);

//    // if columns 2-3 swapped, also update quaternion representation (i dont think we need to though since we're not tracking quats)
///// 4. QR factorization using Givens rotations (find U,S from B=AV)
    glm::mat3 U;
    glm::mat3 Sigma;
    QRDecomposition(B,U,Sigma);
    std::cout << "U" << std::endl;
    printMat3(U);
    std::cout << "Sigma" << std::endl;
    printMat3(Sigma);
    glm::mat3 USV = U * Sigma * glm::transpose(V);
    std::cout << "product USV'"<< std::endl;
    printMat3(USV);

    return 0;
}
예제 #5
0
void test_transform() {

	VecEuler euler;
	Vec3 translation;
	HomogeneousTransform HT,HT2;

	setEuler(DEGTORAD(10),DEGTORAD(20),DEGTORAD(30),euler);
	setVec3(1,2,3,translation);
	poseToHT(euler,translation,HT);

	std::cout << "HT=\n"; printHT(HT,-1,-1);
	

	//test rotation matrix
	Mat3 Rx,Ry,Rz,Rot,Tmp;

	Rotx(euler[0],Rx);
	Roty(euler[1],Ry);
	Rotz(euler[2],Rz);
	multMatMat3(Ry,Rx,Tmp);
	multMatMat3(Rz,Tmp,Rot);
	std::cout << "Rotz(yaw)*Roty(pit)*Rotx(rol)=\n"; printMat3(Rot,-1,-1);

	//test invert transform
	invertHT(HT,HT2);
	std::cout << "inv(HT)=\n"; printHT(HT2,-1,-1);

	//test compose HT
	if (1) {
		//time it

		int n = (int) 1e8;
		timeval t0, t1;

		//compose Homogeneous Transforms
		gettimeofday(&t0, NULL);
		for (int i=0; i<n; i++) { 
			composeHT(HT,HT,HT2);
		}
		gettimeofday(&t1, NULL);

		std::cout << "HT*HT=\n"; printHT(HT2,-1,-1);
	
		std::cout << "iterations: " << (Real) n << std::endl;
		std::cout << "clock (sec): " << tosec(t1)-tosec(t0) << std::endl;
	} else {
		composeHT(HT,HT,HT2);
		std::cout << "HT*HT=\n"; printHT(HT2,-1,-1);
	}

	composeInvHT(HT,HT,HT2);
	std::cout << "inv(HT)*HT=\n"; printHT(HT2,-1,-1);


	//test transform point
	Vec3 p,q;
	setVec3(2,3,4,p);

	std::cout << "p=\n"; printVec3(p,-1,-1);
	applyHT(HT,p,q);
	std::cout << "q=HT*p=\n";	printVec3(q,-1,-1);

	applyInvHT(HT,p,q);
	std::cout << "q=inv(HT)*p=\n"; printVec3(q,-1,-1);

	
	//test converting between angular velocity and Euler rates
	Vec3 vel={1,2,3};
	VecEuler eulerrate;
	MatEuler T;
	std::cout << "angular velocity=\n";	printVec3(vel,-1,-1);

	velToEulerrate(euler,vel,eulerrate,T);
	std::cout << "eulerrate=\n"; printEuler(eulerrate,-1,-1);
	std::cout << "T_vel_to_eulerrate=\n"; printMatReal(3,3,T,-1,-1);

	std::cout << "convert back:\n";
	eulerrateToVel(euler,eulerrate,vel,0);
	std::cout << "angular velocity=\n";	printVec3(vel,-1,-1);
	std::cout << std::endl;

	
	//test at singularity
	setEuler(0,M_PI/2,0,euler);
	setVec3(0,0,1,vel);
	velToEulerrate(euler,vel,eulerrate,T);
	std::cout << "test at singularity:\n";
	std::cout << "euler=\n"; printEuler(euler,-1,-1);
	std::cout << "angular velocity=\n"; printVec3(vel,-1,-1);
	std::cout << "eulerrate=\n"; printEuler(eulerrate,-1,-1);
	
}