gpt4 book ai didi

c++ - 断言失败乘以特征矩阵

转载 作者:行者123 更新时间:2023-11-30 04:11:39 27 4
gpt4 key购买 nike

我正在为插值中的最小二乘精益回归问题编写一个 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:

Assertion failed: a_lhs.cols() == a_rhs.rows() && "invalid matrix product" && "if you wanted a coeff-wise or a dot product use the respective explicit functions"

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

最佳答案

matY是一个 2x1 vector ,matX是一个 NxN 矩阵,所以乘积 matY * matX是无效的。你确定你不想计算 matX作为:

matX = matXdup * matX;

和 matAns 作为:

matAns = matX * matY;

?

顺便说一句,不需要显式转置 matXduptransposeInPlace ,你可以直接做:

matX = matXdup.transpose() * matX;

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

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

关于c++ - 断言失败乘以特征矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20159921/

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