zoukankan      html  css  js  c++  java
  • OpenCV solve() 解线性方程

    今天在学习最小二乘法的时候遇到了solve函数,用来解线性方程 A*X=B

    1 bool cv::solve    
    2 (    
    3 InputArray     src1,
    4 InputArray     src2,
    5 OutputArray     dst,
    6 int     flags = DECOMP_LU 
    7 )    

    src1 线性系统的左侧(相当于上面的A),src2 线性系统的右侧(相当于上面的B),dst 输出的解决方案(相当于要求解的X),flag为使用的方法

    上代码

    1     Mat A = (Mat_<float>(2, 2) << 1,2,3,4);
    2     Mat B = (Mat_<float>(2, 1) <<5,11);
    3     Mat C;
    4     cout <<"A"<<endl<< A << endl;
    5     cout << "B" << endl << B << endl;
    6     solve(A, B, C, CV_LU);
    7     cout << "X" << endl << C << endl;   

    以下是结果

    发现没有问题,然后我们再测试下个例子,修改了输入矩阵和输出矩阵,显而易见,一个矩阵乘单位矩阵是本身,X应该是单位矩阵,但是输出结果却出乎意料,竟然都是0

    1 Mat A = (Mat_<float>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
    2 Mat B = (Mat_<float>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
    3 Mat C;
    4 cout <<"A"<<endl<< A << endl;
    5 cout << "B" << endl << B << endl;
    6 solve(A, B, C, CV_LU);
    7 cout << "X" << endl << C << endl;

    再看了下官方文档 

    就是说我们使用CV_LU方法,如果src1不是奇异矩阵(奇异矩阵行列式为0 ,没有逆矩阵)则返回1,否则返回0 ,于是我修改了下代码

    查看了下源码,发现内部有判断行列式是否为0,如果是0 ,则返回false

    个人觉得是 A*X = B 

                    X = A^-1 * B  

       A^-1 为A的逆矩阵 如果A是奇异矩阵 也就不存在逆矩阵 所以无法计算  所以我们上面求得的X也就不是我们想要的单位矩阵了

  • 相关阅读:
    Java之CyclicBarrier使用
    HashMap,LinkedHashMap,TreeMap的区别
    阿里巴巴常考面试题及汇总答案
    HashTable, HashMap,TreeMap区别
    Java集合类详解
    java代码的几个utils,基本可以直接用
    adb控制手机屏幕滑动(批处理)
    在设备上启用 adb 调试,有一个小秘密
    python clickZan
    python控制鼠标键盘
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14201683.html
Copyright © 2011-2022 走看看