Невозможно достичь того, что вы хотите.Предположим, вы разрешаете пользователю вводить матрицу с произвольными размерами.Тогда компилятор уже выполнил свою работу и не может знать размеры, которые выбирает пользователь.Таким образом, компилятор не может проверить, если две матрицы имеют совместимые измерения.Вы можете написать анализатор, который выполняет некоторый статический анализ кода и сообщает о несоответствиях измерений, но он не найдет все, и я сомневаюсь, что стоит написать его.
Единственный способ принудить поведение компиляторомсоздать отдельный тип для каждого измерения.Но я настоятельно рекомендую вам не делать этого.