gpt4 book ai didi

C++ 矩阵乘法——理解其优化方法背后的逻辑

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:35 25 4
gpt4 key购买 nike

我最近在阅读使用 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;
}

这些是我的问题:

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

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

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

最佳答案

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

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

使用一维数组定义一个 4 x 4 矩阵。所以每行的偏移量是 4。这只是用一维数组模拟二维矩阵。您需要传入指向两个输入矩阵的指针,以便您可以在函数内部获取它们的元素值。

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

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

最初 row_offset 设置为 0。当循环遍历矩阵中的每一行时,row_offsetrow 增加.这是因为在二维矩阵的一维数组表示中,a[i][j]元素可以写成:

a[i][j] = a[i*num_col+j]

而这里的num_col是4。所以这两个说法是不一样的。首先是初始化。第二种是当行索引增加 1 时重置 row_offset

关于C++ 矩阵乘法——理解其优化方法背后的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21010638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com