Как упоминал Ю-Хэд-Лю, вы можете дополнить их нулями, но если p, q и r не близки, сложность вырождается (время для заполнения).
Чтобы ответить на ваш другой вопрос о том, как Eigen это реализует:
В пакетах чисел реализовано умножение матриц, как правило, с использованием типичного алгоритма O (pqr), но в значительной степени оптимизировано "нематематическими" способами: блокировка для лучшей локализации кэша, с использованием специальных инструкций процессора (SIMD и т. *
В некоторых пакетах (MATLAB, Octave, ublas) используются две библиотеки, называемые BLAS и LAPACK, которые обеспечивают примитивы линейной алгебры (например, умножение матриц), сильно оптимизированные таким образом (иногда с использованием аппаратных оптимизаций).
AFAIK, Eigen просто использует инструкции блокировки и SIMD.
Несколько распространенных числовых библиотек (включая Eigen) используют Алгоритм Штрассена . Причина этого на самом деле очень интересная: хотя сложность лучше (O (n ^ (log2 7))), скрытые константы за большим Oh очень велики из-за всех выполненных дополнений - другими словами, алгоритм полезен только на практике для очень больших матриц.
Примечание: Существует еще более эффективный (с точки зрения асимптотической сложности) алгоритм, чем алгоритм Штрассена: алгоритм Coppersmith – Winograd с O (n ^ (2.3727)), но для которых константы настолько велики, что маловероятно, что они когда-либо будут использоваться на практике. Фактически считается, что существует алгоритм, который работает в O (n ^ 2) (что является тривиальной нижней границей, поскольку любой алгоритм должен по крайней мере прочитать n ^ 2 элементов матриц).