Очень старый вопрос, но здесь моя текущая реализация для моих проектов opengl:
typedef float matN[N][N];
inline void matN_mul(matN dest, matN src1, matN src2)
{
unsigned int i;
for(i = 0; i < N^2; i++)
{
unsigned int row = (int) i / 4, col = i % 4;
dest[row][col] = src1[row][0] * src2[0][col] +
src1[row][1] * src2[1][col] +
....
src[row][N-1] * src3[N-1][col];
}
}
Где N заменяется размером матрицы. Так что если вы умножаете матрицы 4х4, то вы используете:
typedef float mat4[4][4];
inline void mat4_mul(mat4 dest, mat4 src1, mat4 src2)
{
unsigned int i;
for(i = 0; i < 16; i++)
{
unsigned int row = (int) i / 4, col = i % 4;
dest[row][col] = src1[row][0] * src2[0][col] +
src1[row][1] * src2[1][col] +
src1[row][2] * src2[2][col] +
src1[row][3] * src2[3][col];
}
}
Эта функция в основном сводит к минимуму циклы, но модуль может облагаться налогом ... На моем компьютере эта функция выполнялась примерно на 50% быстрее, чем функция умножения цикла на тройную.
Минусы:
Требуется много кода (например, различные функции для mat3 x mat3, mat5 x mat5 ...)
Твики, необходимые для нерегулярного умножения (например, mat3 x mat4) .....