Я пытаюсь умножить две матрицы следующим образом:
float values4x3[] = {
3, 3, 3,
1, 1, 1,
2, 2, 2,
1, 1, 1
};
QGenericMatrix< 4, 3, float > myMat4x3 (values4x3);
float values4x4[] = {
3, 3, 3, 3,
1, 1, 1, 1,
2, 2, 2, 2,
1, 1, 1, 1
};
QGenericMatrix< 4, 4, float > myMat4x4 (values4x4);
QGenericMatrix< 4, 3, float > product4x3 = myMat4x4 * myMat4x3;
qDebug() << __func__ << "product4x3 = " << product4x3;
Однако я получаю сообщение об ошибке:
ошибка: нет совпадения для оператора * (типы операндов: QGenericMatrix<4, 4, float> ’и‘ QGenericMatrix<4, 3, float> ’)
Есть этот оператор для умножения двух экземпляров QGenericMatrix
, но я запутался и не уверен, как использовать его со своим NNxM2
а также M1xNN
,
По предложению @scopchanov я поменял две матрицы следующим образом:
QGenericMatrix< 4, 3, float > product4x3 = myMat4x3 * myMat4x4;
Теперь ошибка устранена, и результат записывается так:
qDebug() << __func__ << "product4x3 = " << product4x3;
Журналы:
product4x3 = QGenericMatrix<4, 3, float>(
19 19 19 19
10 10 10 10
10 10 10 10
)
Приведенная выше матрица на самом деле 3x4
! Ну, это немного сбивает с толку.
В математике порядок умножения должен быть MxP
раз PxN
производить MxN
товар. Другими словами, внутренние размеры матриц должны совпадать.
Тем не менее, документация для QGenericMatrix<M1, M2, TT> operator*
состояния:
Возвращает произведение матрицы N1xM2 m1 и матрицы M1xNN m2 для получения результата матрицы M1xM2.
Это означает, что для того, чтобы получить результат умножения A
а также B
надо сначала написать B
а потом A
,
Честно говоря, я нахожу это довольно странным, учитывая то, к чему мы привыкли.
Поменяйте местами матрицы следующим образом:
QGenericMatrix< 4, 3, float > product4x3 = myMat4x3 * myMat4x4;
Для приведенного вами примера результат таков:
MainWindow product4x3 = QGenericMatrix<4, 3, float>(
19 19 19 19
10 10 10 10
10 10 10 10
)
Других решений пока нет …