Ошибка собственного утверждения при преобразовании из MatrixXf в ArrayXf

Я написал простую программу, которая добавляет скаляр к случайной матрице.

#include <Eigen/Dense>

int main() {
    Eigen::MatrixXf mat = Eigen::MatrixXf::Random(100, 100);
    Eigen::ArrayXf arr = mat.array() + 1;
}

Программа компилируется без ошибок. Однако при выполнении этой строки:

Eigen::ArrayXf arr = mat.array() + 1;

Я получаю следующую ошибку:

Assertion failed: (other.rows() == 1 || other.cols() == 1), function resizeLike, file /usr/local/Cellar/eigen/3.3.7/include/eigen3/Eigen/src/Core/PlainObjectBase.h, line 374.

Я прочитал официальную документацию (https://eigen.tuxfamily.org/dox/group__TutorialArrayClass.html) и я не понимаю, что я делаю неправильно.


person David Shatwell    schedule 28.03.2020    source источник


Ответы (3)


Давненько я ничего не делал с Eigen, но я считаю, что нельзя так смешивать массивы и матрицы.

Однако похоже, что вы генерируете матрицу 100x100 со случайными числами, и я не уверен, почему она срабатывает. В данный момент у меня нет готового Eigen, но изменение его для использования массивов фиксированного размера, похоже, работает на Godbolt.

// Type your code here, or load an example.
#include <iostream>
#include <Eigen/Dense>

int main() 
{
    Eigen::Matrix<float, 100, 100> mat = Eigen::Matrix<float, 100, 100>::Random();
    Eigen::Array<float, 100, 100> arr = mat.array() + 1;

    std::cout << "Mat 0,0: " << mat(0,0) << "\nArr 0,0: " << arr(0,0) << "\n";
    std::cout << "Mat 2,0: " << mat(2,0) << "\nArr 2,0: " << arr(2,0);

    return 0;
}
ASM generation compiler returned: 0

Execution build compiler returned: 0

Program returned: 0

Mat 0,0: 0.680375
Arr 0,0: 1.68038
Mat 2,0: 0.566198
Arr 2,0: 1.5662

https://godbolt.org/z/9xu5oW

person Kent    schedule 28.03.2020
comment
Спасибо за ответ. Однако это не решает мою проблему. Код, который я разместил, был просто простым примером. Что мне нужно сделать, так это умножить две динамические матрицы (умножение матриц), а затем добавить результат поэлементно к другой динамической матрице (C = Ax + B). Вы знаете, как я могу это сделать? - person David Shatwell; 29.03.2020

Решил это. Видимо, мне пришлось хранить результат сложения в MatrixXf, а не в ArrayXf.

#include <Eigen/Dense>

int main() {
    Eigen::MatrixXf mat = Eigen::MatrixXf::Random(100, 100);
    Eigen::MatrixXf arr = mat.array() + 1;
}
person David Shatwell    schedule 28.03.2020

Объект Array, соответствующий MatrixXf (он же Matrix<float, Dynamic, Dynamic>), будет ArrayXXf (он же Array<float, Dynamic, Dynamic>). ArrayXf — это определение типа для Array<float, Dynamic, 1>, похожее на VectorXf (также известное как Matrix<float, Dynamic, 1>).

Следующее должно работать как положено:

#include <Eigen/Core>

int main() {
    Eigen::MatrixXf mat = Eigen::MatrixXf::Random(100, 100);
    Eigen::ArrayXXf arr = mat.array() + 1;
}
person chtz    schedule 29.03.2020