当我使用Matrix类型的getCols()方法时,我发现了一个问题。 检查这段代码:
假设orig的大小是[1000,384]而numFeat是= 50;
private Matrix<float> ComputePCA(Matrix<float> orig, int numFeat)
{
Matrix<float> avg = new Matrix<float>(1, orig.Cols);
Matrix<float> eigval = new Matrix<float>(orig.Cols, 1);
Matrix<float> eigvec = new Matrix<float>(orig.Cols, orig.Cols);
Matrix<float> featMat = new Matrix<float>(orig.Rows, numFeat);
CvInvoke.cvCalcPCA(masterMat, avg, eigval, eigvec, Emgu.CV.CvEnum.PCA_TYPE.CV_PCA_DATA_AS_ROW);
Matrix<float> choosenAutovec = new Matrix<float>(orig.Cols, numFeat);
choosenAutovec = eigvec.GetCols(0, numFeat - 1);
featMat = choosenAutovec.Transpose() * orig.Transpose();
return featMat.Transpose();
}
在eigvec.GetCols之后我想有一个大小为[384,50]的变量choosenAutovec对吗?但是我得到了一个矩阵[384,384]而不是......任何建议只需要前50个列?
感谢。
答案 0 :(得分:0)
几乎正确地完成前50列,但 numFeat 不能减少,因为 GetCols 的第二个参数中的索引是独占的。
对于矩阵大小,在调用 GetCols 后, choosenAutovec 的 Data 属性引用与 eigvec 。但是, choosenAutovec 的索引器将像384乘50矩阵一样工作。您可以通过在 featMat 分配后设置断点来自行检查。 featMat 的大小将按预期为50乘1000。
在下一页中,Canming的评论详细描述了 GetCol 的行为(类似于 GetCols ): http://www.emgu.com/bugs/show_bug.cgi?id=19