2012-06-22 2 views
1

Я нашел проблему, когда использую метод getCols() типа Matrix. Проверьте эту кусочек кода:emgu Matrix <float> .getCols

допустим, что размер оригинала [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 я полагаю, чтобы иметь переменную choosenAutovec размера [384, 50] не так ли? Но вместо этого я получаю матрицу [384, 384] ... Любые предложения, чтобы взять только первые 50 колос?

Спасибо.

ответ

0

Принимая первые 50 столбцов выполняется почти правильно, за исключением numFeat не должен быть уменьшен, так как индекс в качестве второго параметра GetCols является эксклюзивным.

Что касается размера матрицы, после вызова GetCols в данных свойства choosenAutovec ссылается на тот же массив поплавков как аналогичный свойству eigvec. Однако указатели choosenAutovec будут работать так, как если бы это была матрица 384 на 50. Вы можете проверить это самостоятельно, установив точку останова после задания featMat. featMat размер будет 50 на 1000, как и предполагалось.

На следующей странице поведение GetCol (который похож на GetCols) подробно описана в комментарии по Canming: http://www.emgu.com/bugs/show_bug.cgi?id=19

 Смежные вопросы

  • Нет связанных вопросов^_^