C++ C++;矩阵乘法-了解优化方法背后的逻辑

C++ C++;矩阵乘法-了解优化方法背后的逻辑,c++,matrix,C++,Matrix,我最近一直在阅读openGL的矩阵教程,偶然发现了一种我无法理解的矩阵乘法优化方法 //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,

我最近一直在阅读openGL的矩阵教程,偶然发现了一种我无法理解的矩阵乘法优化方法

//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;
}
//为矩阵类型创建allias类型
类型定义结构矩阵
{
浮动m[16];
}基质;
//默认矩阵
静态常数矩阵恒等式_矩阵={{
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
} };
矩阵乘法矩阵(常数矩阵*m1,常数矩阵*m2)
{
矩阵out=单位矩阵;
无符号整数行、列、行偏移量;
对于(行=0,行偏移=行*4;行<4;++行,行偏移=行*4)
用于(列=0;列<4;++列)
out.m[行偏移+列]=
(m1->m[行偏移+0]*m2->m[列+0])+
(m1->m[行偏移量+1]*m2->m[列+4])+
(m1->m[行偏移量+2]*m2->m[列+8])+
(m1->m[行偏移+3]*m2->m[列+12]);
返回;
}
以下是我的问题:

  • 在方法多重矩阵中为什么有指向参数m1和m2的指针?如果您只是复制它们的值并返回一个新的矩阵,为什么要使用指针

  • 为什么for循环条件与其增量相同

  • 对于(行=0,行偏移量=行*4;行<4;++行,行偏移量=行* 4

    在多重矩阵方法中,为什么有指向m1和m2的指针?如果只是复制它们的值,为什么要使用指针

    也许我不明白你的问题,但你打算怎么做呢?您正在将产品输出到第三个内存位置
    out
    ,它是
    m1
    m2
    的产品。这是最有效的方法

    为什么for循环条件与其增量相同


    它不是-在每个循环的赋值之前,
    ++行
    递增
    。“条件”是
    行<4
    ,您没有将其加粗-这可能是混淆。

    函数计算两个矩阵的乘积。这就是为什么需要两个矩阵作为这个函数的输入参数。注意,矩阵的定义

    typedef struct Matrix
    {
        float m[16];
    } Matrix;
    

    定义具有1-D数组的4×4矩阵。因此,每行的偏移量为4。这只是用一维阵列模拟二维矩阵。您需要传入指向两个输入矩阵的指针,以便在函数中获取它们的元素值

    在for循环中看到两个相同语句的原因是:

    for (row = 0, row_offset = row * 4; row < 4; ++row, row_offset = row * 4)
    

    这里的
    num\u col
    是4。所以这两种说法是不一样的。首先是初始化。第二种方法是在行索引增加1时重置
    行偏移量

    (请原谅我没有C的knolwedge)在我看来,如果要修改函数参数中列出的原始值,只能使用指针。i、 e.按值传递。为什么要使用“通过引用传递”?同样感谢你提出的第二个问题。我可以编辑并删除第二个问题吗。这是一个查看错误“您需要传入指向两个输入矩阵的指针,以便在函数中获取它们的元素值。”-这是C~中的一条规则吗?是否需要用指针传递“每个”对象数组类型,以便访问其各个元素?对于C或香草C++中的数组,我还是很困惑,最好把它作为指针传递到函数中。您可以将数组视为连续内存块,并使用指针获取第一个元素的地址。这样,在函数中进行数组索引非常有效。
    a[i][j] = a[i*num_col+j]