如何在Eigen3库中添加一个方法来求解方程组

时间:2017-02-08 11:49:12

标签: eigen3

我是Eigen3的新手,我认为这是线性代数的非常好的C ++实现。我想在标准Matrix类中添加一些额外的方法来简化使用,例如,解决我们可以制作的方程系统(来自Eigen网站):

$street = $_GET['street']

它解决方程系统: 这是矩阵A:

Matrix3f A;
Vector3f b;
A << 1,2,3,  4,5,6,  7,8,10;
b << 3, 3, 4;
cout << "Here is the matrix A:\n" << A << endl;
cout << "Here is the vector b:\n" << b << endl;
Vector3f x = A.colPivHouseholderQr().solve(b);
cout << "The solution is:\n" << x << endl;

这是矢量b:

1  2  3
4  5  6
7  8 10

解决方案是:

3
3
4

没关系。我想创建一个名为solveSystem()的新方法 矩阵类。为此,我发现可以创建一个 使用新方法的额外标头,然后使用define #define EIGEN_MATRIXBASE_PLUGIN“MatrixBaseAddons.h”。然后我尝试将其编码为:

-2
 1
 1

我在多个模板中有很多编译错误。我认为这是因为我做错了什么。任何人都知道如何正确传递其他矩阵并返回矩阵以及如何编程这个简单的方法? 提前致谢。 佩德罗

1 个答案:

答案 0 :(得分:0)

插件的问题是它试图将MatrixXd转换为MatrixBase<Matrix3f>(如果您将其应用于顶部的问题)。 通常,您不能创建纯MatrixBase<...>类(它们仅用作基类)。另外,您不能将双矩阵隐式转换为浮点矩阵。

要解决您的问题,类似的方法应该起作用:

template<typename OtherDerived>
Matrix<Scalar, RowsAtCompileTime, OtherDerived::ColsAtCompileTime> solveQr(const MatrixBase<OtherDerived>& b)
{
    return this->colPivHouseholderQr().solve(b);
}

如果要混合使用实矩阵和复杂的b,则需要编写更复杂的内容。