Начнем с того, что умножение вектора на матрицу - это O(m * n) или O(n^2) если ранг матрицы равен длине вектора. Произведение двух квадратных матриц это соответственно O(n^3) или O(m*n*p) если колличества столбцов / строк разняться.
Можно ли это ускорить в общем случае? Можно сделать некоторые оптимизации в полигедральной модели. Ну например сделать loop tiling что улучшить когеренность кеша, векторизировать все это. Ну и пожалй все.
Можно ли это ассимптотически улучшить? В теории можно, если матрица сильно разраженная, но компилятор об этом не догадается.
Можно разбить на блоки и перемножать по-блочно (не путать с тайлизацией)
Можно пойти еще дальше. На сколько мне известно наиболее быстрый вот этот модифицированный алгоритм Копперсмита-Винограда сводящий перемножение матриц из O(n^3) к субкубическому O(n^2.373)
https://people.csail.mit.edu/virgi/matrixmult-f.pdf