如何计算OpenCV中的矩阵排名?

时间:2016-06-18 14:24:00

标签: opencv matrix rank svd

我在OpenCV中有一个非方矩阵。 我想计算它的等级。 我知道你需要进行SVD​​分解并计算行或其中一个部分?不确定... 我真的可以在OpenCV(C / C ++)中使用代码示例,因为我有太多的空间来制作错误...... 我找到了这个帖子...... opencv calculate matrix rank

但它没有代码示例......

所以,如果没有代码示例,你可以解释一下在OpenCV中找到非方阵的排名的步骤吗?

1 个答案:

答案 0 :(得分:0)

如上所述here,您需要找到非零奇异值的数量。因此,首先使用SVD分解找到奇异值,然后计算非零值的数量。您可能需要应用较小的阈值来解决数字错误:

#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;
}