我在Matlab中创建了一个PCA解决方案。我现在正在将它转换为c ++,我使用OpenCV的函数cv::PCA
。我在链接中找到的位置可以使用以下方法提取均值,特征值和特征向量:
// Perform a PCA:
cv::PCA pca(data, cv::Mat(), CV_PCA_DATA_AS_ROW, num_components);
// And copy the PCA results:
cv::Mat mean = pca.mean.clone();
cv::Mat eigenvalues = pca.eigenvalues.clone();
cv::Mat eigenvectors = pca.eigenvectors.clone();
编译并运行。但是当我想使用这些值并查看大小和分配时,我得到一个输入data
的大小,这似乎很奇怪,即。
cv::Size temp= eigenvectors.size();
//temp has the same size as data.size();
在我看来,特征向量应该由num_components
定义,在我的3D空间中,应该只有3x3大小,即9个元素。任何人都可以解释pca.x.clone()的数据大小背后的原因吗?
在opencv和c ++中进行矩阵运算的正确方法是什么,基于文档看起来你可以使用cv::Mat
的运算符。使用上面提取的pca信息,你可以这样做:
cv::Mat Z = data - mean; //according to documentation http://stackoverflow.com/questions/10936099/matrix-multiplication-in-opencv
cv::Mat res = Z*eigenvectors;
它在运行时的测试中崩溃了,可能是因为大小的“误解”/“解释”问题。
问题 基本问题是如何正确使用pca opencv函数?
修改 我测试的另一种方法是使用以下代码:
cv::PCA pca_analysis(mat, cv::Mat(), CV_PCA_DATA_AS_ROW, num_components);
cv::Point3d cntr = cv::Point3d(static_cast<double>(pca_analysis.mean.at<double>(0, 0)),
static_cast<int>(pca_analysis.mean.at<double>(0, 1)), static_cast<double>(pca_analysis.mean.at<double>(0, 2)));
//Store the eigenvalues and eigenvectors
vector<cv::Point3d> eigen_vecs(num_components);
vector<double> eigen_val(num_components);
for (int i = 0; i < num_components; ++i)
{
eigen_vecs[i] = cv::Point3d(pca_analysis.eigenvectors.at<double>(0, i*num_components),
pca_analysis.eigenvectors.at<double>(0, i * num_components + 1), pca_analysis.eigenvectors.at<double>(0, i*num_components + 2));
eigen_val[i] = pca_analysis.eigenvalues.at<double>(0,i);
}
当我将上述代码的结果与我的Matlab实现进行比较时,cntr
似乎是合理的(在百分比差异下)。但是当我在调试器中查看它们时,特征向量和特征值只是零。这似乎可以追溯到我最初的如何提取和理解pca输出的问题。
任何人都可以澄清我错过的东西吗?
答案 0 :(得分:1)
我在搜索如何访问特征值和特征向量时遇到了您的问题。
我个人需要查看完整的信息并希望自己。因此,开发人员可能希望我的用例比您的更有可能。
在任何情况下,当它们被排序时,你可以将第一个'num_components'特征值/特征向量作为你所追求的信息。
此外,从您的角度来看 - 即如果它按预期工作 - 考虑相反:如果您想查看完整信息,您会怎么做?开发人员必须实现一个新参数......