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

GetColsの 2 番目のパラメーターのインデックスが排他的であるため、 numFeatをデクリメントしてはならないことを除いて、最初の 50 列の取得はほぼ正しく行われます。

行列のサイズに関しては、 GetCols を呼び出した後、choosenAutovecDataプロパティは、eigvecの同様のプロパティと同じ float の配列を参照します。ただし、choosenAutovecのインデクサーは、384 x 50 のマトリックスであるかのように機能します。featMat割り当ての後にブレークポイントを設定することで、自分で確認できます。featMatのサイズは、意図したとおり 50 x 1000 になります。

次のページでは、GetCol ( GetColsに似ています) の動作について、Canming によるコメントで詳細に説明されています: http://www.emgu.com/bugs/show_bug.cgi?id=19

于 2012-12-16T07:56:05.010 に答える