gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:32:32 29 4
gpt4 key购买 nike

我正在尝试将一些 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com