В Eigen C++: смешайте сложную матрицу и реальную матрицу

Я хочу добавить реальную матрицу к сложной матрице и сохранить результат в другой сложной матрице. Похоже, Eigen не поддерживает такую ​​операцию. Следующий код не удалось выполнить на этапе компиляции. Причина, по которой я хочу использовать эту функцию, заключается в том, что в шаблонной функции одна входная матрица может быть реальной или сложной, и я хочу, чтобы с ней работал унифицированный код. Почему Eigen не поддерживает такую ​​операцию?

int main(){
    MatrixXd A(2,2);
    MatrixXcd B(2,2);
    A << -1, -2, -3, -4;
    B.real() << 1, 2, 3, 4;
    B.imag() << 5, 6, 7, 8;

    MatrixXcd C(2, 2);
    C = B + A;

    return 0;
}

person kevin    schedule 02.04.2016    source источник


Ответы (2)


Вы должны прочитать сообщения об ошибках. Они помогут вам понять, что между типами данных нет приведения по умолчанию. Чтобы явно преобразовать матрицу double в матрицу std::complex<double>, вы должны написать:

C = B + A.cast<std::complex<double>>();
person Avi Ginsburg    schedule 03.04.2016
comment
Огромное спасибо. Раньше я не знал такой функции. Теперь я нахожу его в eigen.tuxfamily.org/dox/AsciiQuickReference.txt. - person kevin; 03.04.2016

На самом деле, это была тема активной разработки. см. http://eigen.tuxfamily.org/bz/show_bug.cgi?id=279 и https://bitbucket.org/eigen/eigen/pull-requests/194/relax-mixing-type-constraints-for-binary/diff

Теперь ваш код компилируется и работает нормально (попробовано с Eigen 3.3.5). Содержание C с cout:

(0,5) (0,6)
(0,7) (0,8)
person Andrey Pro    schedule 05.11.2018