使用MTL库求解最小二乘解
最小二乘计算最优解不管是哪个行业肯定都用到的非常多。对于遥感图像处理中,尤其是对图像进行校正处理,关于控制点的几种校正模型中,都用到最小二乘来计算模型的系数。比如几何多项式,或者通过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库求解最小二乘解的更多相关文章
- 奇异值分解(SVD)和最小二乘解在解齐次线性超定方程中的应用
奇异值分解,是在A不为方阵时的对特征值分解的一种拓展.奇异值和特征值的重要意义相似,都是为了提取出矩阵的主要特征. 对于齐次线性方程 A*X =0;当A的秩大于列数时,就需要求解最小二乘解,在||X| ...
- 为C量身定制的Matrix库
Matrix库的诞生让矩阵操作在C中也可以玩的很溜! 项目地址:https://github.com/SJ2050SJ/Matrix 文章目录 Matrix的设计框架 Matrix的上手简历 Matr ...
- Python学习笔记-PuLP库(3)线性规划实例
本节以一个实际数学建模案例,讲解 PuLP 求解线性规划问题的建模与编程. 1.问题描述 某厂生产甲乙两种饮料,每百箱甲饮料需用原料6千克.工人10名,获利10万元:每百箱乙饮料需用原料5千克.工人2 ...
- Python数模笔记-PuLP库(1)线性规划入门
1.什么是线性规划 线性规划(Linear programming),在线性等式或不等式约束条件下求解线性目标函数的极值问题,常用于解决资源分配.生产调度和混合问题.例如: max fx = 2*x1 ...
- 距离度量以及python实现(二)
接上一篇:http://www.cnblogs.com/denny402/p/7027954.html 7. 夹角余弦(Cosine) 也可以叫余弦相似度. 几何中夹角余弦可用来衡量两个向量方向的差异 ...
- 距离度量以及python实现(一)
1. 欧氏距离(Euclidean Distance) 欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式. (1)二维平面上两点a(x1,y1)与b(x2,y2)间 ...
- 第一节,TensorFlow基本用法
一 TensorFlow安装 TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tsnsor(张量)意味着N维数组,Flow(流)意味着基 ...
- 概率分布之间的距离度量以及python实现
1. 欧氏距离(Euclidean Distance) 欧氏距离是最易于理解的一种距离计算方法,源自欧氏空间中两点间的距离公式.(1)二维平面上两点a(x1,y1)与b(x2,y2)间的欧 ...
- 代码 | 自适应大邻域搜索系列之(2) - ALNS算法主逻辑结构解析
00 前言 在上一篇推文中,教大家利用了ALNS的lib库求解了一个TSP问题作为实例.不知道你萌把代码跑起来了没有.那么,今天咱们再接再厉.跑完代码以后,小编再给大家深入讲解具体的代码内容.大家快去 ...
随机推荐
- 安卓Tv开发(一)移动智能电视之焦点控制(触控事件)
前言:移动智能设备的发展,推动了安卓另一个领域,包括智能电视和智能家居,以及可穿戴设备的大量使用,但是这些设备上的开发并不是和传统手机开发一样,特别是焦点控制和用户操作体验风格上有很大的区别,本系列博 ...
- 给PLSQL插上飞翔的翅膀-PLSQL优化
60-80% of database performance issues are related to poorly performing SQL,60-80%的数据库性能问题要归结于生产中糟糕的S ...
- JVM类加载原理学习笔记
(1)类的生命周期包括了:加载(Loading).验证(Verification).准备(Preparation).解析(Resolution).初始化(Initialization).使用(Usin ...
- 六星经典CSAPP-笔记(10)系统IO
六星经典CSAPP-笔记(10)系统I/O 1.Unix I/O 所有语言的运行时系统都提供了高抽象层次的I/O操作函数.例如,ANSI C在标准I/O库中提供了诸如printf和scanf等I/O缓 ...
- Swift基础之侧滑Cell显示操作按钮
好久没写过博客了,今天展示一个UITableView基础的内容侧滑Cell的方法使用,之前写过OC语言的http://blog.csdn.net/hbblzjy/article/details/517 ...
- ejabberd mod_echo 解析
ejabberd mod_echo 解析(金庆的专栏 2016.8)按开发入门的说明,mod_echo是最简单的模块之一.https://docs.ejabberd.im/developer/当然 m ...
- EBS多组织结构
1. 业务组: 它代表组织结构的最高层次, 它分离了人力资源的信息. 例如, 当你查询人员时, 它会列出所有分配给相应业务组的成员, 而你自己所属于的组织只不过是业务组的一份子. 这样说可能造成一种误 ...
- Java集合-----java集合框架常见问题
1什么是Java集合API Java集合框架API是用来表示和操作集合的统一框架,它包含接口.实现类.以及帮助程序员完成一些编程的算法. 简言之,API在上层完成以下几件事: ● 编程更加省力,提高城 ...
- Nginx的负载均衡 - 加权轮询 (Weighted Round Robin) 下篇
Nginx版本:1.9.1 我的博客:http://blog.csdn.net/zhangskd 上篇blog讲述了加权轮询算法的原理.以及负载均衡模块中使用的数据结构,接着我们来看看加权轮询算法的具 ...
- C++对C语言的变量检测增强
在C语言中,重复定义多个同名的全局变量是合法的 在C++中,不允许定义多个同名的全局变量 C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上 demo #include <st ...