我正在尝试将一些 matlab 代码转换为 C++
我正在使用 Eigen这是一个很棒的库(如果你不知道就试试吧)
但我正在尝试转换这一行:
x = B/A
与
B = rand(7,20);
A = rand(1,20);
Matlab 中的代码没有问题,它返回一个数组 (1x7)
使用 Eigen(这里是代码:
#include <Eigen/Core>
#include <Eigen/Dense>
#include <iostream>
Matrix<double, Dynamic, Dynamic> A(7,20);
Matrix<double, Dynamic, Dynamic> B(1,20);
cout<< A.colPivHouseholderQr().solve(B);
我得到一个断言失败:
rhs.rows() == dec.rows()
看来我只能解决相同行数的矩阵系统?
我的数学有点受限,但是无论如何有办法解决吗?
我也试过这段代码:
cout << (A.transpose() * A).ldlt().solve(A.transpose() * B)
和
cout <<A.jacobiSvd(ComputeThinU | ComputeThinV).solve(B)
谢谢
杰夫
问题是:
在 MATLAB 中,B/A
solves the equation xA=B
。
在 Eigen 中,solve
方法求解方程 Ax=B
。在 MATLAB 中,这将表示为 x = A\B
。
它们非常不同 - 矩阵乘法不是可交换的!
一般来说,矩阵乘积Ax
与A
的行数相同,与x
的列数相同。因此,要使等式 Ax=B
有意义,A
的行数必须与 B
相同(这是您的断言错误所在来自)。
现在两者通过等式 B/A = (A'\B')'
相关联,因此您可以执行类似(未经测试的代码)
Matrix<double, Dynamic, Dynamic> C = A.transpose().fullPivLu().solve(B.transpose());
cout << C.transpose();
我是一名优秀的程序员,十分优秀!