必威体育Betway必威体育官网
当前位置:首页 > IT技术

opencv学习——solve()

时间:2019-08-28 02:11:59来源:IT技术作者:seo实验室小编阅读:66次「手机版」
 

solve

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

参考官方文档

bool cv::solve(InputArray src1,
  InputArray src2,
  OutputArray dst,
  int flags = DECOMP_LU 
 )

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

代码

Mat A = (Mat_<float>(2, 2) << 1,2,3,4);
	
	Mat B = (Mat_<float>(2, 1) <<5,11);

	

	Mat C;
	cout <<"A"<<endl<< A << endl;
	cout << "B" << endl << B << endl;

	solve(A, B, C, CV_LU);
	
	cout << "X" << endl << C << endl;

以下是结果

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

Mat A = (Mat_<float>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);

	Mat B = (Mat_<float>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);

	Mat C;
	cout <<"A"<<endl<< A << endl;
	cout << "B" << endl << B << endl;

	solve(A, B, C, CV_LU);
	
	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也就不是我们想要的单位矩阵了

相关阅读

通过ContentResolver获取本地的文件

自己的云盘中有代码 文件名(通过ContentResolver获取本地的文件)http://blog.csdn.net/chay_chan/article/details/76984665

es6 Promise.resolve()方法

Promise.resolve()方法 有时需要将现有对象转为 Promise 对象,Promise.resolve方法就起到这个作用。const jsPromise = Promise.re

excel2010使用solver求解的方法步骤详解

在办公中,人们经常使用Excel进行数据的存储、对比、以及计算。而 solver是Excel里的求解器。也是经常用到的一个功能。下面是由seo

SolveigMM Video Splitter视频合并分割软件如何合并视

SolveigMM Video Splitter是一款出色的视频分割剪切、视频合并软件,可以作为MPEG-2、AVI、WMV、ASF、MP3、WMA编辑器使用,是Solveig

分享到:

栏目导航

推荐阅读

热门阅读