我试图将一些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)
感谢
杰夫
答案 0 :(得分:2)
问题在于:
在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();
答案 1 :(得分:-1)