기본 콘텐츠로 건너뛰기

[OpenCV]matrix operations

  • Matrix-matrix operations:
    CvMat *Ma, *Mb, *Mc;
    cvAdd(Ma, Mb, Mc); // Ma+Mb -> Mc
    cvSub(Ma, Mb, Mc); // Ma-Mb -> Mc
    cvMatMul(Ma, Mb, Mc); // Ma*Mb -> Mc
  • Elementwise matrix operations:
    CvMat *Ma, *Mb, *Mc;
    cvMul(Ma, Mb, Mc); // Ma.*Mb -> Mc
    cvDiv(Ma, Mb, Mc); // Ma./Mb -> Mc
    cvAddS(Ma, cvScalar(-10.0), Mc); // Ma.-10 -> Mc
  • Vector products:
    double va[] = {1, 2, 3};
    double vb[] = {0, 0, 1};
    double vc[3];

    CvMat Va=cvMat(3, 1, CV_64FC1, va);
    CvMat Vb=cvMat(3, 1, CV_64FC1, vb);
    CvMat Vc=cvMat(3, 1, CV_64FC1, vc);

    double res=cvDotProduct(&Va,&Vb); // dot product: Va . Vb -> res
    cvCrossProduct(&Va, &Vb, &Vc); // cross product: Va x Vb -> Vc
    end{verbatim}
    Note that Va, Vb, Vc, must be 3 element vectors in a cross product.

  • Single matrix operations:
    CvMat *Ma, *Mb;
    cvTranspose(Ma, Mb); // transpose(Ma) -> Mb (cannot transpose onto self)
    CvScalar t = cvTrace(Ma); // trace(Ma) -> t.val[0]
    double d = cvDet(Ma); // det(Ma) -> d
    cvInvert(Ma, Mb); // inv(Ma) -> Mb
  • Inhomogeneous linear system solver:
    CvMat* A = cvCreateMat(3,3,CV_32FC1);
    CvMat* x = cvCreateMat(3,1,CV_32FC1);
    CvMat* b = cvCreateMat(3,1,CV_32FC1);
    cvSolve(&A, &b, &x); // solve (Ax=b) for x
  • Eigen analysis (of a symmetric matrix):
    CvMat* A = cvCreateMat(3,3,CV_32FC1);
    CvMat* E = cvCreateMat(3,3,CV_32FC1);
    CvMat* l = cvCreateMat(3,1,CV_32FC1);
    cvEigenVV(&A, &E, &l); // l = eigenvalues of A (descending order)
    // E = corresponding eigenvectors (rows)
  • Singular value decomposition:
    CvMat* A = cvCreateMat(3,3,CV_32FC1);
    CvMat* U = cvCreateMat(3,3,CV_32FC1);
    CvMat* D = cvCreateMat(3,3,CV_32FC1);
    CvMat* V = cvCreateMat(3,3,CV_32FC1);
    cvSVD(A, D, U, V, CV_SVD_U_T|CV_SVD_V_T); // A = U D V^T

  • 댓글