2016-06-18 8 views
0

OpenCV에서 비 사각형 매트릭스가 있습니다. 순위를 계산하고 싶습니다. SVD 분해를 수행하고 행을 계산해야하거나 일부분을 계산해야한다는 것을 알고 있습니까? ...이 스레드 ... opencv calculate matrix rankOpenCV에서 매트릭스 순위를 계산하는 방법은 무엇입니까?

을 발견 너무 많은 공간이 있기 때문에 내가 실수를하는 정말 ..., OpenCV의 (C/C++)에서 코드 예제를 사용할 수 있습니다 그러나 그것은 확실히이되지 않음 코드 예제가 없습니다 ...

그래서 코드 예제가 없으면 OpenCV에서 비 정방 행렬의 순위를 찾는 단계를 설명 할 수 있습니까?

답변

0

here에서 언급했듯이 0이 아닌 특이 값의 수를 찾아야합니다. 따라서, 먼저 SVD 분해로 특이 값을 찾은 다음, 0이 아닌 값의 수를 계산하십시오. 숫자 오류를 설명하기 위해 작은 기준을 적용해야 할 수도 있습니다.

#include <opencv2\opencv.hpp> 
using namespace cv; 

int main() 
{ 
    // Your matrix 
    Mat1d M = (Mat1d(4,5) << 1, 0, 0, 0, 2, 
           0, 0, 3, 0, 0, 
           0, 0, 0, 0, 0, 
           0, 2, 0, 0, 0); 

    // Compute SVD 
    Mat1d w, u, vt; 
    SVD::compute(M, w, u, vt); 

    // w is the matrix of singular values 
    // Find non zero singular values. 

    // Use a small threshold to account for numeric errors 
    Mat1b nonZeroSingularValues = w > 0.0001; 

    // Count the number of non zero 
    int rank = countNonZero(nonZeroSingularValues); 

    return 0; 
}