Заполнить матрицу A (собственный :: Matrix2d A) числами с использованием циклов

#c #eigen #eigen3

#c #eigen #eigen3

Вопрос:

Всякий раз, когда я пробую этот код, я получаю сообщение об ошибке утверждения! Как я могу заполнить матрицу A с помощью циклов?

 #include <iostream>
#include "../eigen3/Eigen/Dense"
int main ()
{
 Eigen::Matrix2d A;
 for (int row = 0; row < 5;   row)
  {
   for (int col = 0; col < 5;   col)
    {
//     A(row,col)=10;   // ???
    }
  }

}
  

Комментарии:

1. я должен был использовать Eigen::MatrixXd A (S, B); теперь это работает ,,

Ответ №1:

Ну, то, что вы делаете, правильно. Однако Matrix2d класс, как следует из названия, представляет собой матрицу 2×2. Таким образом, вы не можете увеличить row / col выше 1:

  Eigen::Matrix2d A;
 for (int row = 0; row < 2;   row)
  {
   for (int col = 0; col < 2;   col)
    {
     A(row,col) = 10;
    }
  }
  

Если вам нужна матрица 5×5, вы можете использовать Xd-матрицу с подходящим конструктором:

  Eigen::MatrixXd A(5, 5);
 for (int row = 0; row < 5;   row)
  {
   for (int col = 0; col < 5;   col)
    {
     A(row,col) = 10;
    }
  }
  

Если размеры известны во время компиляции, вы можете в качестве альтернативы использовать реализацию, которая позволяет избежать выделения памяти и остается в стеке:

  Eigen::Matrix<double, 5, 5> A;
 for (int row = 0; row < 5;   row)
  {
   for (int col = 0; col < 5;   col)
    {
     A(row,col) = 10;
    }
  }
  

Ответ №2:

Matrix2d является определением Matrix<double, 2, 2> типа . Итак, это матрица 2×2, и вы обрабатываете столбцы и строки до 4, вот почему вы получаете Assertion failed . Вам нужно MatrixXd 5×5:

 Eigen::MatrixXd A(5, 5);
for (int row = 0; row < 5;   row)
{
   for (int col = 0; col < 5;   col)
   {
        A(row,col) = 10;
   }
}