emgu Matrix <float> .getCols </float>

时间:2012-06-22 11:14:32

标签: c# matrix emgucv

当我使用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个列?

感谢。

1 个答案:

答案 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