Я пытаюсь найти собственные значения для симметричной матрицы следующим образом:
Mat t(2, 2, CV_32F);
t.at<float>(0, 0) = 1;
t.at<float>(0, 1) = 0;
t.at<float>(1, 0) = 0;
t.at<float>(1, 1) = 128;
Mat eigVal,eigVec;
eigen(t,eigVal,eigVec);
Когда я печатаю собственные значения для этой матрицы, это дает мне правильный ответ.
cout << eigVal.at<float>(0) << "," << eigVal.at<float>(1) << "\n";
Выход, который я получаю, составляет 128,1. Но когда я меняю свою матрицу следующим образом:
t.at<float>(0, 0) = 4;
t.at<float>(0, 1) = 2;
t.at<float>(1, 0) = 1;
t.at<float>(1, 1) = 3;
Я не получаю правильный ответ. Выход, который я ожидаю, составляет 5,2. Но вместо этого я получаю выходные данные как 5.56155 и 1.43845.
Может кто-нибудь сказать мне, где я сделал ошибку
eigen
работает только на симметричных матрицах (с равными значениями по обе стороны от главной диагонали). Тебе нужно eigenNonSymmetric
для несимметричных матриц:
#include <stdio.h>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char *argv[])
{
Mat t(2, 2, CV_32F);
t.at<float>(0, 0) = 4;
t.at<float>(0, 1) = 2;
t.at<float>(1, 0) = 1;
t.at<float>(1, 1) = 3;
Mat eigVal,eigVec;
eigenNonSymmetric(t,eigVal,eigVec);
cout << eigVal.at<float>(0) << "," << eigVal.at<float>(1) << "\n";
return 0;
}
Выход:
5,2
Других решений пока нет …