1

我在使用 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 列吗?

谢谢。

4

1 回答 1

0

获取前 50 列几乎是正确的,除了numFeat不能减少,因为GetCols的第二个参数中的索引是独占的。

至于矩阵大小,在调用GetCols之后, choosenAutovec的Data属性引用了与eigvec的类似属性相同的浮点数。但是,choosenAutovec的索引器将像 384 x 50 矩阵一样工作。您可以通过在featMat赋值后设置断点来自行检查。按照预期, featMat的大小将是 50 x 1000。

在下面的页面中, Canming的评论中详细描述了 GetCol的行为(类似于GetCols ): http ://www.emgu.com/bugs/show_bug.cgi?id=19

于 2012-12-16T07:56:05.010 回答