矩阵求逆的方法——使用特征值

12

我已经学会了如何使用Eigen来找到矩阵的逆。但是当我尝试找一个函数输出的数组的逆时,遇到了错误:

请求‘inverse’成员在‘x’中,而‘x’是非类类型‘double**’

请帮忙解决一下,如何使用C++库来求矩阵的逆。

我所写的代码如下:

#include <iostream>
#include <armadillo>
#include <cmath>
#include <Eigen/Dense>

using namespace std;
using namespace arma;
using namespace Eigen;

int main()
{
    vec a;
    double ** x;

    double ** inv_x;
    a <<0 << 1 << 2 << 3 << 4; //input vector to function
    double ** f (vec a); //function declaration

    x= f(a);   // function call

    //inv_x=inv(x);

    cout << "The inverse of x is:\n" << x.inverse() << endl; // eigen command to find inverse
    return 0;
}

// function definition 
double ** f(vec a)
{
    double ** b = 0;
    int h=5;

    for(int i1=0;i1<h;i1++)
    {
         b[i1] = new double[h];
         {
            b[i1][0]=1;
            b[i1][1]=a[i1];
            b[i1][2]=a[i1]*a[i1]+1/12;
            b[i1][3]=pow(a[i1],3)+a[i1]/4;
            b[i1][4]=1/80+pow(a[i1],2)/2+pow(a[i1],4);
        }

    }
    return b;
}

这里用户定义的函数f返回一个数组x。我正在尝试使用Eigen库找到x的逆。


1
这是因为它是一个double**,而不是Eigen矩阵吗? - user253751
@immibis 先生,我想使用 eigen 库找到一个矩阵的逆,而不使用“eigen”矩阵声明语法,如“Matrix3f”等。 - AGN
@J.P.Quenord-Zermingore,先生,除了使用自己的矩阵声明语法之外,是否有其他库可以直接求解用标准C++语法声明的矩阵的逆矩阵? - AGN
2
“double **”这种方式声明矩阵除了最简单的玩具程序之外,对于其他任何程序都是一种可怕的方式。(首先,它以不友好的缓存方式将矩阵分散在内存中,其次很难避免内存泄漏,第三,您无法封装维度。)使用专门设计的“Matrix”类要好得多 - 您不能使用Eigen吗? - Martin Bonner supports Monica
@MartinBonner,抱歉我的代码实践不好(这是一段代码)。即使我像a[2][2]这样定义一个矩阵并尝试使用库找到它的逆,我仍然会遇到一些错误。 - AGN
显示剩余8条评论
1个回答

13

首先,如Martin Bonner所提到的那样,不要使用double**来存储矩阵,而是确保系数是按顺序存储的。

然后,您可以使用Eigen :: Map类将原始缓冲区视为Eigen对象,具体文档介绍在这里。例如:

double data[2][2];
Eigen::Map<Matrix<double,2,2,RowMajor> > mat(data[0]);
mat = mat.inverse();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接