В соответствии с python документами о приоритете оператора, оператор @
имеет ассоциативность слева направо
https://docs.python.org/3/reference/expressions.html#operator -приоритет
Операторы в той же группе блоков слева направо (за исключением возведения в степень, которая группируется справа налево).
Поэтому эквивалентная операция
rotMat = torch.matmul(torch.matmul(xmat, ymat), zmat)
Хотя имейте в виду это умножение матриц ассоциативно (математически), поэтому вы не увидите большой разницы в результате, если вы сделаете это иначе. Как правило, вы хотите связать таким образом, чтобы получить наименьшее количество вычислительных шагов. Например, используя алгоритм умножения наивной матрицы, если X равен 1x10, Y равен 10x100, а Z равен 100x1000, тогда разница между
(X @ Y) @ Z
и
X @ (Y @ Z)
составляет около 1 * 10 * 100 + 1 * 100 * 1000 = 101 000 операций умножения / сложения для первой и 10 * 100 * 1000 + 1 * 10 * 1000 = 1 001 000 операций для второй. Хотя они имеют одинаковый результат (игнорируя ошибки округления), вторая версия будет примерно в 10 раз медленнее!
Как указывалось в @Szymon Maszke, тезоры pytorch также поддерживают оператор @
, так что вы все еще можете используйте
xmat @ ymat @ zmat
в pytorch.