300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 妈妈再也不用担心我的矩阵运算了!Mosek学习笔记5 矩阵。

妈妈再也不用担心我的矩阵运算了!Mosek学习笔记5 矩阵。

时间:2021-05-15 19:28:27

相关推荐

妈妈再也不用担心我的矩阵运算了!Mosek学习笔记5 矩阵。

Mosek学习笔记系列就要接近尾声了。

(Mosek学习笔记系列之前的链接:/aliexken/article/details/104443873)

之所以把矩阵放的比较靠后,是因为其重要性。作为优化过程中承载数据的载体,矩阵的相关运算直接决定了建立优化问题模型的方式。经过研究后,非常遗憾,我还是没能找到能够舍弃Eigen的Mosek矩阵运算方法。Expr提供的矩阵运算形式,更多的是一种方程约束形式的表示,而不是直接的矩阵运算。即你不能通过Expr直接算出两个矩阵的和,但是却可以表示两个矩阵的和,并放入约束中,使用优化来获取值。感觉很绕,我猜想这和mosek在设计之初,以优化为第一目的的设计理念有关。

尽管如此,我还是非常认真的做了mosek学习笔记的原因,该工具还是能够将矩阵与线性代数运算和优化系统结合在一起,提供了完备的解决方案,而且最重要的是,提供了良好的C++接口!对基于VS开发C++算法的我来说简直就是福音!

闲话少说,上干货。

1. 矩阵初始化

矩阵初始化可以分为稠密矩阵和稀疏矩阵两种

预定了shape形态的矩阵。

auto A = new_array_ptr<double,2>({ {1,2,3,4}, {5,6,7,8} });auto Ad= Matrix::dense(A);

基于一维向量模式。

auto Af = new_array_ptr<double,1>({ 1,2,3,4,5,6,7,8 });auto Aff= Matrix::dense(2,4,Af);

稀疏矩阵

auto rows = new_array_ptr<int,1>({ 0, 0, 1, 1 });auto cols = new_array_ptr<int,1>({ 0, 3, 1, 3 });auto values = new_array_ptr<double,1>({ 1.0, 2.0, 3.0, 4.0 }); auto ms = Matrix::sparse(rows->size(), cols->size(), rows, cols, values);

总结起来,也就是一个转置矩阵操作。

2. 结合线性代数的运算

Expr::add(Expr::mul(A,x), Expr::mul(B,y));Expr::add(new_array_ptr<Variable::t,1>({x, y, z, w}));

3. 约束域Domain的运算

有了矩阵的初始化,线性代数计算以及约束域方法,我们就可以建立相应的约束规则。

在实际编程的时候,发现这个矩阵计算还是有点问题,Expr这个线性代数的计算不是直接针对矩阵的,看起来像是针对优化问题的,所以还是不能像eigen一样那么方便,除非是所有的矩阵都求好了才能够列在限制条件里,这个确实有点坑。如果有空的话,在补一期mosek与eigen配合使用的说明教程。

上面所有的Mosek介绍全部都是基于Fusion Model来进行的,也就是:MOSEKFusion API for C++ 9.1.13。当我真正使用这套工具来做多元优化问题的时候,我傻了!使用几何规划实在是非常麻烦,在经过一天半的努力尝试后,我几乎要放弃了,都准备要转qpOASES学习。所谓踏破铁鞋无觅处,我找到了MOSEKOptimizer API for C 9.1.13。我原来以为Mosek的功能实现是相同的,只不过是基于C++或C的编译器,做不同的接口罢了,但是!我看了MOSEKOptimizer API for C 9.1.13,这里分明有多元优化问题的成熟解决方案!好吧,哥们今天就跟你干上了,新开一个mosek学习笔记!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。