2015-05-13 5 views
1

Я пытаюсь вычислить собственный вектор матрицы 4x4 в opencv.
Для этого я сначала вычислить собственное значение по следующей формуле:вычисление собственного вектора из сложного собственного значения в opencv

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-х собственных значений I принимают наибольшее значение, и я хочу использовать, что с этой формулой:

(A - lambda * identity matrix) v = 0 

I попытался использовать мою исходную матрицу A с opencv-функцией «eigen()», но это не дает мне результатов, которые я ищу.
Я также пытался использовать RREF (уменьшенная строка эшелона строк), однако я не знаю, как это сделать со сложными собственными значениями.

Так что мой вопрос: как бы вы вычислили этот собственный вектор?

Я подключил свои данные до wolframalpha, чтобы увидеть, какими должны быть мои результаты.

+0

«не дает мне результаты, которые я ищу», то, что вы имеете в виду этим? какие результаты вы получаете? Попробовали ли вы решить уравнение самостоятельно или только через 'eigen()'? – user463035818

+0

Если вам нужно только самое высокое собственное значение и соответствующий ему собственный вектор, использование [итерации мощности] (http://en.wikipedia.org/wiki/Power_iteration) может быть опцией – user463035818

+0

@ tobi303 eigen() всегда будет возвращать: [ -0,50, -0,50, -0,50, 0,50; 0,50, 0,50, -0,50, 0,50; -0,50, 0,50, 0,50, 0,50; -0.50, 0.50, -0.50, -0.50] только +/- будет отличаться. Я проверил бы итерацию мощности и посмотрю, является ли это то, что я ищу – sadhi

ответ

1

Поэтому я решил проблему, используя «ComplexEigenSolver» от 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) 
1

Opencv уже имеет функцию для вычисления собственных значений и собственных векторов, cv::eigen(). Я советую использовать его вместо написания алгоритма самостоятельно.

Здесь хорошо blog, что объясняет, как это сделать в c, C++ и python.

+1

спасибо за ваш ответ, но, как вы могли прочитать, cv :: eigen() не дает мне ответа, который я ищу, поскольку он всегда возвращает примерно те же самые векторы с разными матрицами. – sadhi