从opencv中的复特征值计算特征向量
calculating the eigenvector from a complex eigenvalue in opencv
我正在尝试在 opencv 中计算 4x4 矩阵的特征向量。
为此我首先根据这个公式计算特征值:
Det( A - lambda * identity matrix ) = 0
来自 wiki on eigenvalues and eigenvectors.
解决这个问题后,它给了我 4 个看起来像这样的特征值:
0.37789 + 1.91687i
0.37789 - 1.91687i
0.412312 + 1.87453i
0.412312 - 1.87453i
我从这 4 个特征值中取最大值,我想将其用于此公式:
( A - lambda * identity matrix ) v = 0
我尝试将原始矩阵 A 与 opencv 函数一起使用 "eigen()",但这并没有给我想要的结果。
我也尝试使用 RREF(减少行阶梯形式),但是我不知道如何使用复杂的特征值来做到这一点。
所以我的问题是,你会如何计算这个特征向量?
我将数据插入 wolframalpha 以查看我的结果。
Opencv已经有计算特征值和特征向量的功能,cv::eigen()
。我建议使用它而不是自己编写算法。
这里很好 blog 解释了如何在 c、c++ 和 python 中执行此操作。
所以我使用'ComplexEigenSolver' from the Eigen library 解决了这个问题。
//create a multichannel matrix
Mat a_com = Mat::zeros(4,4,CV_32FC2);
for(int i = 0; i<4; i++)
{
for(int j = 0; j<4; j++)
{
a_com.at<Vec2f>(i,j)[0] = a.at<double>(i,j);
a_com.at<Vec2f>(i,j)[1] = 0;
}
}
MatrixXcf eigenA;
cv2eigen(a_com,eigenA); //convert OpenCV to Eigen
ComplexEigenSolver<MatrixXcf> ces;
ces.compute(eigenA);
cout << "The eigenvalues of A are:\n" << ces.eigenvalues() << endl;
cout << "The matrix of eigenvectors, V, is:\n" << ces.eigenvectors() << endl;
这给了我以下输出(这或多或少是我正在寻找的):
The eigenvalues of A are:
(0.3951,-1.89571)
(0.3951,1.89571)
(0.3951,1.89571)
(0.3951,-1.89571)
The matrix of eigenvectors, V, is:
(-0.704546,0) (-5.65862e-009,-0.704546) (-0.064798,-0.0225427) (0.0167534,0.0455606)
(-2.22328e-008,0.707107) (0.707107,-1.65536e-008) (0.0206999,-0.00474562) (-0.0145628,-0.0148895)
(-6.07644e-011,0.0019326) (0.00193259,-4.52426e-011) (-0.706729,6.83797e-005) (-0.000121153,0.706757)
(-1.88954e-009,0.0600963) (0.0600963,-1.40687e-009) (0.00200449,0.703827) (-0.70548,-0.00151068)
我正在尝试在 opencv 中计算 4x4 矩阵的特征向量。
为此我首先根据这个公式计算特征值:
Det( A - lambda * identity matrix ) = 0
来自 wiki on eigenvalues and eigenvectors.
解决这个问题后,它给了我 4 个看起来像这样的特征值:
0.37789 + 1.91687i
0.37789 - 1.91687i
0.412312 + 1.87453i
0.412312 - 1.87453i
我从这 4 个特征值中取最大值,我想将其用于此公式:
( A - lambda * identity matrix ) v = 0
我尝试将原始矩阵 A 与 opencv 函数一起使用 "eigen()",但这并没有给我想要的结果。
我也尝试使用 RREF(减少行阶梯形式),但是我不知道如何使用复杂的特征值来做到这一点。
所以我的问题是,你会如何计算这个特征向量?
我将数据插入 wolframalpha 以查看我的结果。
Opencv已经有计算特征值和特征向量的功能,cv::eigen()
。我建议使用它而不是自己编写算法。
这里很好 blog 解释了如何在 c、c++ 和 python 中执行此操作。
所以我使用'ComplexEigenSolver' from the Eigen library 解决了这个问题。
//create a multichannel matrix
Mat a_com = Mat::zeros(4,4,CV_32FC2);
for(int i = 0; i<4; i++)
{
for(int j = 0; j<4; j++)
{
a_com.at<Vec2f>(i,j)[0] = a.at<double>(i,j);
a_com.at<Vec2f>(i,j)[1] = 0;
}
}
MatrixXcf eigenA;
cv2eigen(a_com,eigenA); //convert OpenCV to Eigen
ComplexEigenSolver<MatrixXcf> ces;
ces.compute(eigenA);
cout << "The eigenvalues of A are:\n" << ces.eigenvalues() << endl;
cout << "The matrix of eigenvectors, V, is:\n" << ces.eigenvectors() << endl;
这给了我以下输出(这或多或少是我正在寻找的):
The eigenvalues of A are:
(0.3951,-1.89571)
(0.3951,1.89571)
(0.3951,1.89571)
(0.3951,-1.89571)
The matrix of eigenvectors, V, is:
(-0.704546,0) (-5.65862e-009,-0.704546) (-0.064798,-0.0225427) (0.0167534,0.0455606)
(-2.22328e-008,0.707107) (0.707107,-1.65536e-008) (0.0206999,-0.00474562) (-0.0145628,-0.0148895)
(-6.07644e-011,0.0019326) (0.00193259,-4.52426e-011) (-0.706729,6.83797e-005) (-0.000121153,0.706757)
(-1.88954e-009,0.0600963) (0.0600963,-1.40687e-009) (0.00200449,0.703827) (-0.70548,-0.00151068)