2012-06-22 1 views
1

Matrix 형식의 getCols() 메서드를 사용할 때 문제가 있음을 발견했습니다. 다음 코드 부분을 확인하십시오 :emgu Matrix <float> .getCols

orig의 크기는 [1000, 384]이고 numFeat는 50이라고 가정합니다. I는 적합한 크기의 변수 choosenAutovec [50 (384),] 갖도록 가정 eigvec.GetCols 후

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(); 
    } 

? 하지만 매트릭스 대신에 [384, 384]를 얻습니다. 처음 50 컬럼 만 가져 가면 어떤 제안이 나옵니까?

감사합니다. 제 50 개 컬럼 촬영

답변

0

는가 배타 GetCols의 두번째 파라미터 인덱스 이후 감소되지 않아야 numFeat 제외한 거의 정확하게 이루어진다. GetCols에게 choosenAutovec 참조 eigvec의 유사한 속성으로 플로트 같은 배열의 속성 데이터 호출 후 매트릭스 크기로

. 그러나 choosenAutovec의 인덱서는 마치 384x50 매트릭스 인 것처럼 작동합니다. featMat 지정 다음에 중단 점을 설정하여 직접 확인할 수 있습니다. featMat 크기는 의도 한대로 50 x 1000입니다. 이 페이지에서

Canming하여 주석에 상세히 설명한다 (GetCols 비슷) GetCol 동작 : http://www.emgu.com/bugs/show_bug.cgi?id=19