计算特征值时的误差

时间:2018-02-24 05:24:09

标签: c++ eigenvalue opencv3.2

我试图找到一个对称矩阵的特征值,如下所示: -

    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。 任何人都可以告诉我我错在哪里

1 个答案:

答案 0 :(得分:1)

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