void cvEigenVV( CvArr* mat, CvArr* evects, CvArr* evals, double eps=0 );
mat
输入对称方阵。在处理过程中将被改变。
evects
特征向量输出矩阵, 连续按行存储 (按行?)
evals
特征值输出矩阵,按降序存储(当然特征值和特征向量的排序是同步的)。
eps
对角化的精确度 (典型地, DBL_EPSILON=≈10-15 就足够了)
其中的lowindex和highindex都有默认值为-1,eps默认值为0
#include "stdafx.h"
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
void PrintMatrix(CvMat *Matrix,int Rows,int Cols);
double Array1[]={2,3,0,3,5,-1,0,-1,2};
int main()
{
CvMat *Matrix1=cvCreateMat(3,3,CV_64FC1);
CvMat *EigenValue_Row=cvCreateMat(3,1,CV_64FC1);
CvMat *EigenValue=cvCreateMat(3,3,CV_64FC1);
CvMat *EigenVector=cvCreateMat(3,3,CV_64FC1);
CvMat *EigenVector_Invert=cvCreateMat(3,3,CV_64FC1);
CvMat *ResultMatrix=cvCreateMat(3,3,CV_64FC1);
cvSetData(Matrix1,Array1,Matrix1->step);
cvSetZero(EigenValue);
cvEigenVV(Matrix1,EigenVector,EigenValue_Row,DBL_EPSILON);
printf("\nThe EigenValue_Row is:\n");
PrintMatrix(EigenValue_Row,EigenValue_Row->rows,EigenValue_Row->cols);
printf("\nThe EigenVector is:\n");
PrintMatrix(EigenVector,EigenVector->rows,EigenVector->cols);
printf("\nThe EigenValue is:\n");
cvSet2D(EigenValue,0,0,cvGet2D(EigenValue_Row,0,0));
cvSet2D(EigenValue,1,1,cvGet2D(EigenValue_Row,1,0));
cvSet2D(EigenValue,2,2,cvGet2D(EigenValue_Row,2,0));
PrintMatrix(EigenValue,EigenValue->rows,EigenValue->cols);
cvTranspose(EigenVector,EigenVector);
cvmMul(EigenVector,EigenValue,ResultMatrix);
cvInvert(EigenVector,EigenVector_Invert,CV_LU);
cvmMul(ResultMatrix,EigenVector_Invert,ResultMatrix);
printf("\nTo validate Matrix\n");
PrintMatrix(ResultMatrix,ResultMatrix->rows,ResultMatrix->cols);
system("pause");
}
void PrintMatrix(CvMat *Matrix,int Rows,int Cols)
{
for(int i=0;i<Rows;i++)
{
for(int j=0;j<Cols;j++)
{
printf("%.2f ",cvGet2D(Matrix,i,j).val[0]);
}
printf("\n");
}
}
结果输出:
利用matlab 得到的结果是:
A =
2 3 0
3 5 -1
0 -1 2
[v,d]=eigs(A)
v =
-0.5071 -0.3162 0.8018
-0.8452 0.0000 -0.5345
0.1690 -0.9487 -0.2673
d =
7.0000 0 0
0 2.0000 0
0 0 0.0000
我们可以看到利用matlab 得到的结果 与opencv 得到的结果不是很一样