matlab - opencv和matlab的特征值不一样,为什么?

标签 matlab opencv pca

我正在尝试 PCA 的示例,我发现使用 MATLAB 的特征值与使用 OpenCV 的值不同,而特征向量相同。有谁知道为什么?这两种算法有什么区别?

我的MATLAB代码如下:

a=[-14.8271317103068,-3.00108550936016,1.52090778549498,3.95534842970601;...
   -16.2288612441648,-2.80187433749996,-0.410815700402130,1.47546694457079;...
   -15.1242838039605,-2.59871263957451,-0.359965674446737,1.34583763509479;...
   -15.7031424565913,-2.53005662064257,0.255003254103276,-0.179334985754377;...
   -17.7892158910100,-3.32842422986555,0.255791146332054,1.65118282449042;...
   -17.8126324036279,-4.09719527953407,-0.879821957489877,-0.196675865428539;...
   -14.9958877514765,-3.90753364293621,-0.418298866141441,-0.278063876667954;...
   -15.5246706309866,-2.08905845264568,-1.16425848541704,-1.16976057326753;];

[covEigvec, ~,covEigval] = princomp(a, 'econ');

我的OpenCV代码如下:

cv::Mat sampleset(nums,dim,CV_32FC1,data);
cv::PCA *pca = new cv::PCA(sampleset,cv::Mat(),CV_PCA_DATA_AS_ROW,redDim);

最佳答案

是的,这些特征值在一定程度上是不同的。

因为 opencv 在计算协方差矩阵时缩放数据。

参见core/src/matmul.cpp:2226(大致在这里)

    mulTransposed( data, _covar, ((flags & CV_COVAR_NORMAL) == 0) ^ takeRows,
    mean, (flags & CV_COVAR_SCALE) != 0 ? 1./nsamples : 1, ctype );

这个函数最终会调用gemm,它的第五个参数作为比例因子

关于matlab - opencv和matlab的特征值不一样,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25497988/

相关文章:

r - MATLAB 和 R 之间的执行时间差异很大

matlab - 通过减小最大向量的大小,使不等长向量的长度相等

python - opencv 在 osx 上安装没有合适的图像错误

r - Z 标准化使得 PC1 和 PC2 在此 PCA 分析中完全相同 : Why?

python - 在 PCA 之前对不同数据类型进行标准化

matlab - 在 Simulink 中以编程方式突出显示对话框选项

c++ - 使用 C++ MATLAB API 定义二维数组

python - 使用opencv,tensorflow和python进行人体检测

c++ - 使用 Open CV 时 Visual Studio 中未处理的异常

r - PCA - 主要成分是如何映射的?