Собственное комплексное матрично-векторное умножение - PullRequest
0 голосов
/ 05 января 2020

У меня есть эти собственные комплексные матрицы:

Eigen::MatrixXcd matrix;
Eigen::VectorXcd rhs;
Eigen::VectorXcd solution;

Я могу успешно загрузить значения и вычислить решение, но если я попытаюсь:

rhs = matrix*solution;

, я получаю ошибки компилятора, связанные с перегрузкой Оператор "+ =" и двойное / сложное преобразование в собственных файлах GeneralProduct.h и CxRealAbs.h

Подобные проблемы при попытке вычисления остатка.

Есть ли

Помогите ??

спасибо

Кевин

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Проблема была моей. Я перегрузил оператор * для std :: complex * real, потому что некоторые более ранние версии std были неполными. Первая ошибка в списке была в Eigen, которая привела меня в заблуждение.

GeneralProduct.h (287): нет жизнеспособного перегруженного '+ ='

CxRealAbs.h (111): невозможно преобразовать 'const Eigen :: Map, -1, 1, 0, -1, 1>, 1, Eigen :: Stride <0, 0>> 'в' double 'без преобразования

Удалите мою перегрузку и она скомпилируется и работает нормально. Никаких проблем с матрицами Eigen динамика c.

спасибо за ответы.

Кевин

0 голосов
/ 05 января 2020

Согласно своей документации, Eigen проверяет действительность операций:

Срок действия операций Eigen проверяет достоверность операций, которые вы выполняете. Когда это возможно, он проверяет их во время компиляции, вызывая ошибки компиляции. Эти сообщения об ошибках могут быть длинными и безобразными, но Эйген пишет важное сообщение в UPPERCASE_LETTERS_SO_IT_STANDS_OUT. Например:

Matrix3f m;
Vector4f v;
v = m*v;      // Compile-time error: YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES

Конечно, во многих случаях, например, при проверке динамических размеров c, проверка не может быть выполнена во время компиляции. Затем Eigen использует утверждения времени выполнения. Это означает, что программа будет прервана с сообщением об ошибке при выполнении недопустимой операции, если она будет запущена в «режиме отладки», и, вероятно, обработает sh, если утверждения отключены.

MatrixXf m(3,3);
VectorXf v(4);
v = m * v; // Run-time assertion failure here: "invalid matrix product"

Eigen

Ваш RHS является вектором, и вы пытаетесь присвоить ему значение или набор значений из матрицы и векторного произведения. Даже с математической точки зрения вы должны спросить себя, является ли это допустимым типом операции.

Считайте, что M и N являются матрицами, а A & B являются векторами, которые являются результатами из следующих операций:

M = AB // Cross product and not a dot product
M = AM, MA, BM, MB // yields a transformed matrix using the original matrix
M = AN, NA, BN, NB // yields a transformed matrix using a supplied matrix

A = AA, AB, BA // cross product and not the dot product

A = AM, MA, AN, NA, BM, MB, BN, NB // yields what? 

Таким образом, в Eigen во время компиляции он проверяет правильность ваших операторов и, следовательно, выдает ошибку времени компиляции, что += не определен и что вы не предоставили перегруженную версию. Он просто не знает, как выполнить запланированную операцию. Не должно иметь значения, что является базовым типом классов matrix и vector. Это относится к тому факту, что операторы, которые вы пытаетесь выполнить, не определены где-либо.


Редактировать

Вот ссылка, которая описывает умножение матриц и векторов , Интуитивно мы предполагаем, что это дает вектор, однако это подразумевается неявно, но с точки зрения матрицы этот вектор может быть строкой или столбцом, так что возвращаемый вектор может быть либо 1xM, либо Mx1 матрицей.

Вот ссылка, показывающая различные интерпретации, даже если они будут возвращать один и тот же результат: это можно найти в разделе 3.2.3 документации: Maxtrix-Vector Product

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

Это не главная проблема вашей проблемы. В конце дня компилятор все еще генерирует сообщение об ошибке, что перегруженный оператор не определяется. Я не знаю, откуда это в вашем коде. Так что это может быть внутри самой библиотеки при попытке выполнить операции над их версией типов Complex. Не имея возможности запустить и скомпилировать ваш полный исходный код, я не могу легко определить, что именно генерирует эту ошибку компилятора, и я также не знаю, какой компилятор, который вы используете, генерирует ваши ошибки.

...