Принудительно проверять размеры матриц во время выполнения

#c #eigen

#c #eigen

Вопрос:

Похоже, что собственный модуль не проверяет размеры динамических матриц. Например, если я выполню следующий код:

 auto EA = Eigen::MatrixXf(3, 2);
auto EB = Eigen::MatrixXf(3, 2);
for (auto i = 0; i < 3;   i)
{
  for (auto j = 0; j < 2;   j)
  {
    EA(i,j) = i   j   1;
    EB(i,j) = i   j   1;
  }
}
auto EC = EA*EB;
std::cout << "EA: " << std::endl << EA << std::endl;
std::cout << "EB: " << std::endl << EB << std::endl;
std::cout << "EC: " << std::endl << EC << std::endl;
  

Он выводит:

 EA:
1 3
2 3
2 4
EB:
1 3
2 3
2 4
EC:
 7 12
 8 15
10 18
  

Как мне заставить собственный модуль проверять размеры матриц во время выполнения? Это было бы действительно полезно для начинающих и для отладки.

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

1. На самом деле это проверка размеров при компиляции с флагами отладки. Я не уверен, что мой вопрос все еще актуален или нет.

Ответ №1:

Проверка размеров происходит только тогда, когда NDEBUG макрос не определен. Обычно это означает отладочную сборку.

Пример без NDEBUG , где проверки успешно прерывают программу:

 g   test.cpp -o test -I /usr/include/eigen3 amp;amp; ./test
test: /usr/include/eigen3/Eigen/src/Core/ProductBase.h:102: Eigen::ProductBase<Derived, Lhs, Rhs>::ProductBase(const Lhsamp;, const Rhsamp;) [with Derived = Eigen::GeneralProduct<Eigen::Matrix<float, -1, -1>, Eigen::Matrix<float, -1, -1>, 5>; Lhs = Eigen::Matrix<float, -1, -1>; Rhs = Eigen::Matrix<float, -1, -1>]: Assertion `a_lhs.cols() == a_rhs.rows() amp;amp; "invalid matrix product" amp;amp; "if you wanted a coeff-wise or a dot product use the respective explicit functions"' failed.
Aborted (core dumped)
  

И с NDEBUG :

 g   test.cpp -o test -I /usr/include/eigen3 -DNDEBUG amp;amp; ./test
EA: 
1 2
2 3
3 4
EB: 
1 2
2 3
3 4
EC: 
 5  8
 8 13
11 18
  

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

1. Да, я написал комментарий по этому поводу. Спасибо за ответ.