【发布时间】: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