Наивный алгоритм умножения матриц 4x4 выглядит следующим образом:
void matrix_mul(double out[4][4], double lhs[4][4], double rhs[4][4]) {
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
out[i][j] = 0.0;
for (int k = 0; k < 4; ++k) {
out[i][j] += lhs[i][k] * rhs[k][j];
}
}
}
}
Очевидно, что этот алгоритм дает фиктивные результаты, если out == lhs
или out == rhs
(здесь ==
означает ссылочное равенство). Есть ли версия, которая позволяет одному или двум из этих случаев не просто копировать матрицу? Я рад иметь различные функции для каждого случая, если это необходимо.
Я нашел этот документ, но в нем обсуждается алгоритм Штрассен-Винограда, который является излишним для моих маленьких матриц. Ответы на этот вопрос, похоже, указывают на то, что если out == lhs && out == rhs
(т.е. Мы пытаемся квадрат матрицы), то это невозможно сделать на месте, но даже там нет убедительных доказательств или доказательств.