Ошибка подтверждения умножения собственных матриц

Я пишу программу на 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 ()  "недопустимый матричный продукт"  «если вы хотите, чтобы число или точечный продукт использовали соответствующие явные функции»

Когда я удаляю это утверждение, код работает. До этого момента код работает нормально. Может кто-нибудь объяснить мне, что такое проблема утверждения и как ее здесь исправить?

1

Решение

matY является вектором 2х1 и 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() вместо того, чтобы писать свою собственную обратную процедуру (необходимо включить <Eigen/LU>:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]