添加行和列主矩阵

Adding row- and columnmajor matrix

本文关键字:添加行      更新时间:2023-10-16

我想在C++中创建一个循环,添加两个矩阵,其中第一个是存储为行主矩阵,第二个存储为列主矩阵。然而,我不确定指数之间的数学关系是什么。我试图为 3x3 矩阵执行此操作。在本例中,索引的排列如下所示:

0 1 2 3 4 5 6 7 8
0 3 6 1 4 7 2 5 8

我可以在迭代时以封闭形式编写它吗,例如:

A[i]+B[f(i)]

首先,以下是结论性公式:

f(i) = 3 * (i % 3) + (i / 3);

这里i被视为第一个矩阵的迭代索引,它存储为行主要,索引的对应位置是(i / 3, i % 3)

因此,第二个矩阵存储为主要列,相应的位置由交换行号和列号(i % 3, i / 3)

Index = 3 * row + column,所以总之,第二个矩阵的迭代索引,表示为f(i),是3 * (i % 3) + (i / 3)

如果第一个矩阵中的行数为 r,列数为 c,则

f(i) = i / r + i % c * r

我正在利用第一项的整数除法以及第二项中%*从左到右的结合性%*具有相同的优先级)。

显式计算 indeces 排列公式的另一种方法是考虑列中属于同一行的元素的距离 主要存储矩阵:

// given rows and cols as the number of rows and columns of the matrices
size_t max_index = rows * cols - 1;
for ( size_t i = 0, j = 0; i <= max_index; ++i ) {
    c_rm[i] = a_rm[i] + b_cm[j];
    j += rows;
    if ( j > max_index )
        j -= max_index;
}

这可能比计算整数除法、提醒和每个索引值的乘法更快。