最小二乘计算最优解不管是哪个行业肯定都用到的非常多。对于遥感图像处理中,尤其是对图像进行校正处理,关于控制点的几种校正模型中,都用到最小二乘来计算模型的系数。比如几何多项式,或者通过GCP求解RPC系数,以及RPC的间接优化等都是离不开最小二乘的。下面使用MTL库编写的最小二乘求解AX=B形式的X最优解。

关于MTL库的类型定义可以参考之前写的求解特征值和特征向量那篇博客。地址为:http://blog.csdn.net/liminlu0314/article/details/8957155

首先是函数定义:

	/**
* @brief 求解矩阵Ax=B的最小二乘解集
* 注意:矩阵A的行数与B的行数必须相等,否则不能计算,此外X的大小与A的列数必须一致
* @param A 系数矩阵
* @param B 增广矩阵中的B
* @param X 解集
* @return 是否计算成功
*/
bool SloveMartix(const Matrix A, const Matrix B, Vector &X);

接下来就是函数实现,其实用MTL库很简单,一共也就十几行的代码。实现代码如下。

bool SloveMartix(const Matrix A, const Matrix B, Vector &X)
{
/*/
/* 求解矩阵 AX = B 的最小二乘解集
/* 注意:矩阵A的行数与B的行数必须相等,否则不能计算,此外X的大小与A的列数必须一致
/* 按最小二乘法组成法方程:
/* (A'*A)*X = (A'*B) 其中A'为A的转置矩阵
/* 设:N=(A'*A), W=(A'*B) 法方程为 N*X=W
/*/ int irows = A.nrows();
int icols = A.ncols(); // 矩阵A的行数与B的行数必须相等,否则不能计算,此外X的大小与A的列数必须一致
if (irows != B.nrows() || icols != X.size())
return false; Matrix At(icols, irows); //A的转置矩阵
transpose(A,At); Matrix N(icols, icols);
mult(At, A, N); //计算N=(A'*A) Matrix W(icols, 1);
mult(At, B, W); //计算W=(A'*B) Vector pvector(icols);
lu_factor(N, pvector); Vector b(icols);
for(size_t i=0; i<b.size(); i++)
b[i] = W(i,0); lu_solve(N, pvector, b, X); return true;
}

上面的代码与Matlab比较过,计算的结果是完全一样,除了小数点十几位后有些精度上的问题。不过一般肯定用不到那么高的精度。

参考资料:

[1]http://zh.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%98%E6%B3%95

[2] http://baike.baidu.com/view/139822.htm

[3]http://blog.sciencenet.cn/blog-430956-621997.html

[4]http://www.orbitals.com/self/least/least.htm

[5]http://blog.csdn.net/liminlu0314/article/details/8957155

使用MTL库求解最小二乘解的更多相关文章

  1. 奇异值分解(SVD)和最小二乘解在解齐次线性超定方程中的应用

    奇异值分解,是在A不为方阵时的对特征值分解的一种拓展.奇异值和特征值的重要意义相似,都是为了提取出矩阵的主要特征. 对于齐次线性方程 A*X =0;当A的秩大于列数时,就需要求解最小二乘解,在||X| ...

  2. 为C量身定制的Matrix库

    Matrix库的诞生让矩阵操作在C中也可以玩的很溜! 项目地址:https://github.com/SJ2050SJ/Matrix 文章目录 Matrix的设计框架 Matrix的上手简历 Matr ...

  3. Python学习笔记-PuLP库(3)线性规划实例

    本节以一个实际数学建模案例,讲解 PuLP 求解线性规划问题的建模与编程. 1.问题描述 某厂生产甲乙两种饮料,每百箱甲饮料需用原料6千克.工人10名,获利10万元:每百箱乙饮料需用原料5千克.工人2 ...

  4. Python数模笔记-PuLP库(1)线性规划入门

    1.什么是线性规划 线性规划(Linear programming),在线性等式或不等式约束条件下求解线性目标函数的极值问题,常用于解决资源分配.生产调度和混合问题.例如: max fx = 2*x1 ...

  5. 距离度量以及python实现(二)

    接上一篇:http://www.cnblogs.com/denny402/p/7027954.html 7. 夹角余弦(Cosine) 也可以叫余弦相似度. 几何中夹角余弦可用来衡量两个向量方向的差异 ...

  6. 距离度量以及python实现(一)

    1. 欧氏距离(Euclidean Distance)        欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式. (1)二维平面上两点a(x1,y1)与b(x2,y2)间 ...

  7. 第一节,TensorFlow基本用法

    一 TensorFlow安装 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tsnsor(张量)意味着N维数组,Flow(流)意味着基 ...

  8. 概率分布之间的距离度量以及python实现

    1. 欧氏距离(Euclidean Distance)       欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式.(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧 ...

  9. 代码 | 自适应大邻域搜索系列之(2) - ALNS算法主逻辑结构解析

    00 前言 在上一篇推文中,教大家利用了ALNS的lib库求解了一个TSP问题作为实例.不知道你萌把代码跑起来了没有.那么,今天咱们再接再厉.跑完代码以后,小编再给大家深入讲解具体的代码内容.大家快去 ...

随机推荐

  1. MYSQL 索引类型、什么情况下用不上索引、什么情况下不推荐使用索引

    mysql explain的使用: http://blog.csdn.net/kaka1121/article/details/53394426 索引类型 在数据库表中,对字段建立索引可以大大提高查询 ...

  2. Android广播的发送与接收

    Android广播的发送与接收 效果图 广播发送 广播分为有序广播和无序广播 有序广播与无序广播的区别 无序广播:只要是广播接收者指定了接收的事件类型,就可以接收到发送出来的广播消息.不能修改消息. ...

  3. Java web文件上传下载

    [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/52048666 作者:朱培 ID:sdksdk0 邮 ...

  4. 微信小程序基础之表单Form的使用

    表单Form的应用很广泛,我们可以利用form设计登录注册,也可以设计一种答题问卷的形式,今天主要讲一下form的使用 form表单,将组件内输入的"switch","i ...

  5. 去除CSDN 博客页广告的历程

    第一招 方式1 方式2 第二招 第三招 素材准备 必备知识 代码部分 测试 总结 作为CSDN的忠实用户,我觉得它挺不错的.美中不足的是广告,虽然相比于微博啊,开源中国啊这些博客站点,它的广告已经算是 ...

  6. 剑指Offer——求职必备神器

    剑指Offer--求职必备神器 前言   不管是公司网申.银行招聘.面试等等,"谈谈你的职业规划"."以往工作中遇到了哪些棘手问题?你是如何解决的?".&quo ...

  7. Java提升篇之反射的原理(二)

    Java提升篇之通过反射越过泛型检查 /* *问题:在一个ArrayList<Integer>对象中,在这个集合中添加一个字符串. */ 在我们还没有学反射前,遇到这个问题都是无法实现的, ...

  8. Swift中的as操作符

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交 ...

  9. Java基础---Java---正则表达式-----匹配、切割、替换、获取等方法

    正则表达式:符合一定规则的表达式 作用:用于专门操作字符串 特点:用于一些特定的符号来表示一些代码操作,这样就简化书写,主要是学习一些特殊符号的使用 好处:可以简化对字符串的复杂操作. 弊端:符号定义 ...

  10. ajax post请求request.getParameter("")取值为null

    今天在写提交一个json数据到后台,然后后台返回一个json数据类型.但是发现后台通过request.getParamter("")取到的值为null. 于是写一个简单的ajax ...