вычисление собственного вектора из комплексного собственного значения в opencv

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

Det( A - lambda * identity matrix ) = 0

Взято из вики о собственных значениях и собственных векторах.
После решения этой задачи я получил 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()", но это не дает мне результатов, которые я ищу. не знаю, как это сделать со сложными собственными значениями.

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

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


person sadhi    schedule 13.05.2015    source источник
comment
не дает мне результатов, которые я ищу, что вы подразумеваете под этим? какие результаты вы получаете? Вы пытались решить уравнение самостоятельно или только через eigen()?   -  person 463035818_is_not_a_number    schedule 13.05.2015
comment
Если вам нужно только самое высокое собственное значение и соответствующий ему собственный вектор, можно использовать мощную итерацию.   -  person 463035818_is_not_a_number    schedule 13.05.2015
comment
@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] будут отличаться только +/-. Я проверю итерацию мощности и посмотрю, это ли то, что я ищу.   -  person sadhi    schedule 13.05.2015


Ответы (2)


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

Вот хороший блог, в котором объясняется, как это сделать в c, c++ и python.

person Yonatan Simson    schedule 13.05.2015
comment
спасибо за ваш ответ, но, как вы могли прочитать, cv::eigen() не дает мне ответа, который я ищу, поскольку он всегда возвращает примерно одни и те же векторы с разными матрицами. - person sadhi; 18.05.2015

Поэтому я решил проблему, используя '1ComplexEigenSolver.html" rel="nofollow">ComplexEigenSolver' из библиотека Eigen.

//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)
person sadhi    schedule 19.05.2015