特征:求解A = xB(断言失败)

时间:2014-06-11 13:31:49

标签: c++ matlab eigen

我试图将一些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)

感谢

杰夫

2 个答案:

答案 0 :(得分:2)

问题在于:

在MATLAB中,B/A solves the equation xA=B

在Eigen中,solve方法求解方程Ax=B。在MATLAB中,这将表示为x = A\B

这些是非常不同的 - 矩阵乘法可交换!

通常,矩阵产品AxA具有相同的行数,与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)

如果你期待mldivide

对于系统:Ax = b要解决此问题,您需要执行以下操作:x = A\B

因此,在您的情况下,您正试图解决:xA = b

为什么在本征中你的矩阵维度是不合适的。