C矩阵乘法 – 理解优化方法背后的逻辑

我最近一直在阅读使用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.

点赞