【问题标题】:Assertion failure multiplying Eigen matrices乘以特征矩阵的断言失败
【发布时间】:2013-11-23 07:43:46
【问题描述】:

我正在为插值中的最小二乘精益回归问题编写一个 C++ 程序。我使用 Eigen 进行矩阵运算。我遇到的问题是,当我运行程序时,它显示一个错误,显示一个断言错误。这是我的代码:

#include <iostream>
#include <Eigen/Dense>
using Eigen::MatrixXd;
using namespace std;
int main()
{
    int i;
    int nmbrOfPoints;
    cout<<" Enter the number of data points : ";
    cin>>nmbrOfPoints;

    MatrixXd matY(nmbrOfPoints,1);       //initialize matrix Y
    MatrixXd matX(nmbrOfPoints,2);       //initialize matrix X
    MatrixXd matXdup(nmbrOfPoints,2);      //initialize matrix X duplicate
    MatrixXd matAns(2,1);


    for(i=0;i<nmbrOfPoints;i++)
    {
        matX(i,0)=1;                    // storing the 1 st column of the matrix x, all 1s.
        matXdup(i,0)=1;
    }

    cout<<"Enter all sample points (x and y values ): "<<endl;

    for(i=0;i<nmbrOfPoints;i++)
    {
        cin>>matX(i,1)>>matY(i,0); // read both (x,f(x)) ,, store x values to matrix x and y values to matrix y
    }

    for(i=0;i<nmbrOfPoints;i++)
    {
        matXdup(i,1)=matX(i,1);    //copying matrix x to its duplicate
    }

    cout<<"\n \n";
    cout << matX << endl;
    cout<<"\n \n";
    cout << matY << endl;
    cout<<"\n \n";
    cout << matXdup << endl;

    // find the transpose of matrix x

    cout << "\nHere is the transposed matrix x duplicate:\n" << endl;
    matXdup.transposeInPlace();


    cout << matXdup << endl;
    cout<<"\n \n";
    cout << matX << endl;

    //find the multiplication of x and transpose of x

    matX = matX* matXdup;   // now the matrix x holds the multiplication of transpose of x and x

    cout << "\nmultiplication of x and xdup:\n" << endl;
    cout << matX << endl;
    cout<<"\n \n";

    //find the inverse of x

    double q,a,b,c,d;

    a=matX(0,0);
    b=matX(0,1);
    c=matX(1,0);
    d=matX(1,1);

    q=1/((a*d)-(b*c));

    matX(0,0) = d*q;
    matX(0,1) = b*-1*q;             //now matrix x holds the inverse of x
    matX(1,0) = c*-1*q;
    matX(1,1) = a*q;

    cout<<"\n \n";
    cout << "\n inverse of x:\n" << endl;
    cout << matX << endl;

    //find the multiplication of transpose of x(x duplicate matrix) and y

     matY = matXdup* matY;   // now the matrix x duplicate holds the multiplication of y and x transpose

    //find the multiplication of x(inverse of xt*x) and matXdup (xt*y)

    // matAns = matY* matX;

     cout << "\nfinal answers :\n" << endl;
     cout << "\n *********************:\n" << endl;

     cout << matY << endl;
     cout<<"\n \n";
     cout << matX << endl;

     cout << "\nfinal answer FINAL :\n" << endl;
     cout << "\n *********************:\n" << endl;
     matAns = matY* matX;
     cout << matAns << endl;

     /*cout<<"\n matx dup = \n";
     cout << matXdup << endl;
     cout<<"\n maty =  \n";
     cout << matY << endl;
     cout<<"\n \n";*/

     return 0;


}

我从最后的乘法部分得到错误,即matAns = matY* matX

断言失败:a_lhs.cols() == a_rhs.rows() && "invalid matrix product" && "if you want a coeff-wise or a dot product use the specific explicit functions"

当我删除该语句代码时。到目前为止,代码工作正常。有人可以在这里解释一下什么是断言问题以及如何解决它吗?

【问题讨论】:

  • 错误是什么?特征断言通常包含有用的信息。
  • 请在编译时包含所有警告和调试信息(例如g++ -Wall -g)并学习如何使用调试器(例如Linux 上的gdb)。
  • 通常,断言错误表明您以某种方式违反了您调用的函数的“合同”。您没有提供太多细节,但由于您正在做矩阵乘法,我猜您选择了两个矩阵,其大小意味着它们不能相乘。
  • 我正在使用代码块,如何编译时出现警告。
  • 错误说断言失败:a_lhs.cols() == a_rhs.rows() && "invalid matrix product" && "if you want a coeff-wise or a dot product use the specific explicit functions

标签: c++ codeblocks matrix-multiplication eigen least-squares


【解决方案1】:

matY 是 2x1 向量,matX 是 NxN 矩阵,所以乘积 matY * matX 无效。您确定不想将matX 计算为:

matX = matXdup * matX;

和matAns:

matAns = matX * matY;

?

顺便说一句,不需要将matXdup显式转置为transposeInPlace,你可以直接这样做:

matX = matXdup.transpose() * matX;

此外,当一个维度在编译时已知并且该维度非常小,最好指定它。例如,matY 应该是 VectorXd。 matXdup.transpose() * matX 的结果应该存储在 Matrix2d 对象中。然后调用inverse() 而不是自己编写逆例程(需要包含&lt;Eigen/LU&gt;

Matrix2d XX = matXdup.transpose() * matX; 
Vector2d Y = matXdup * matY;
Vector2d ans = XX.inverse() * Y;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多