我最近一直在阅读使用openGL的Matrix Tutorials,并偶然发现了一种我无法理解的Matrix Multiplication优化方法.
//Create an allias type for a Matrix Type
typedef struct Matrix
{
float m[16];
} Matrix;
//default matrix
static const Matrix IDENTITY_MATRIX = { {
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
} };
Matrix MultiplyMatrices(const Matrix* m1, const Matrix* m2)
{
Matrix out = IDENTITY_MATRIX;
unsigned int row, column, row_offset;
for (row = 0, row_offset = row * 4; row < 4; ++row, row_offset = row * 4)
for (column = 0; column < 4; ++column)
out.m[row_offset + column] =
(m1->m[row_offset + 0] * m2->m[column + 0]) +
(m1->m[row_offset + 1] * m2->m[column + 4]) +
(m1->m[row_offset + 2] * m2->m[column + 8]) +
(m1->m[row_offset + 3] * m2->m[column + 12]);
return out;
}
这些是我的问题:
>在MultiplyMatrices方法中,为什么有一个指向params m1和m2的指针?如果您只是复制它们的值并返回一个新矩阵,为什么要使用指针?
>为什么for循环条件与其增量相同?
for (row = 0, row_offset = row * 4; row < 4; ++row, row_offset = row *
4)
最佳答案 MultiplyMatrices函数计算两个矩阵的乘积.这就是为什么你需要两个矩阵作为这个函数的输入参数.注意矩阵的定义
typedef struct Matrix
{
float m[16];
} Matrix;
定义具有1-D阵列的4乘4矩阵.因此每行的偏移量为4.这只是为了模拟具有1-D阵列的2-D矩阵.您需要将指针传递给两个输入矩阵,以便可以在函数内部获取它们的元素值.
您在for循环中看到两个相同语句的原因是:
for (row = 0, row_offset = row * 4; row < 4; ++row, row_offset = row * 4)
最初,row_offset设置为0.当循环遍历矩阵中的每一行时,row_offset随行增加.这是因为在2-D矩阵的1-D数组表示中,a [i] [j]元素可以写成:
a[i][j] = a[i*num_col+j]
这里num_col是4.所以这两个语句不一样.首先是初始化.第二种是在行索引增加1时重置row_offset.