我有一个具有相同列数的矩阵向量,即std::vector<cv::Mat> v
,我想使用所有这些来应用cv::PCA
(没有降维)。最后,我希望结果也适用于原始矩阵。
代码说,这是我到目前为止唯一的解决方案:
std::vector<cv::Mat> v;
//fill v
cv::Mat bigMat;
for(size_t i=0; i<v.size(); i++)
bigMat.push_back(v[i]);
cv::PCA pca(bigMat, cv::Mat(), CV_PCA_DATA_AS_ROW);
for(size_t i=0; i<v.size(); i++)
bigMat = pca.project(bigMat);
但这不会影响v[i]
。我怎样才能有效地做到这一点?请注意,我必须稍后使用bigMat
的预计版本。这是我想到的唯一解决方案:
cv::PCA pca(bigMat, cv::Mat(), CV_PCA_DATA_AS_ROW);
bigMat.release();
for (size_t i=0; i<v.size(); i++){
v[i] = pca.project(v[i]);
bigMat.push_back(v[i]);
}
但这有点难看,我也不知道效率如何。有没有更好的解决方案(效率是首要任务)?
如果你徘徊,v[i]
是i-th
图像的描述符集。如果您问自己为什么我的PCA中没有降低维数,请查看this论文。