c++ - Eigen : solving A=xB (Assert failed)

标签 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)

谢谢

杰夫

最佳答案

问题是:

在 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();

关于c++ - Eigen : solving A=xB (Assert failed),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24164275/

相关文章:

c++ - 从 demangled 名称中获取 mangled 名称

c++ - Visual Studio 中 <variadic template> 模板参数具有默认值编译错误

matlab - 改进从 m 文件运行 Simulink 模型

从头开始实现的 C++ 神经网络在 MNIST 上无法达到 50% 以上

c++ - 编译错误:. ..未在此范围内声明

c++ - 结合 Eigen 和 CppAD

c++ - 如何关闭 std::fixed 并返回默认的 C++ 设置

c++ - 无法在汇编中链接 C++ 函数

java - 无法通过 Java 在 MATLAB 中加载 DLL

python - 为什么sklearn(python)和matlab统计包中的LASSO不同?