Согласно своей документации, 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
. Не имея возможности запустить и скомпилировать ваш полный исходный код, я не могу легко определить, что именно генерирует эту ошибку компилятора, и я также не знаю, какой компилятор, который вы используете, генерирует ваши ошибки.