添加行和列主矩阵 < P>我想在C++中添加一个循环,其中两个矩阵存储第一行作为行主要存储,第二个矩阵作为列主存储。然而,我不确定指数之间的数学关系是什么。我试着为3x3矩阵做这件事。在这种情况下,索引的排列如下所示: 0 1 2 3 4 5 6 7 8 0 3 6 1 4 7 2 5 8

添加行和列主矩阵 < P>我想在C++中添加一个循环,其中两个矩阵存储第一行作为行主要存储,第二个矩阵作为列主存储。然而,我不确定指数之间的数学关系是什么。我试着为3x3矩阵做这件事。在这种情况下,索引的排列如下所示: 0 1 2 3 4 5 6 7 8 0 3 6 1 4 7 2 5 8,c++,C++,我可以在迭代时以封闭形式编写此代码,如: A[i]+B[f(i)] 首先,以下是结论性公式: f(i) = 3 * (i % 3) + (i / 3); 这里,i被视为第一个矩阵的迭代索引,它存储为行主,索引的对应位置是(i/3,i%3) 因此,第二个矩阵作为列主矩阵存储,对应的位置是通过交换行和列编号的(i%3,i/3) 由于Index=3*行+列,因此总之,表示为f(i)的第二个矩阵的迭代索引是3*(i%3)+(i/3),如果第一个矩阵中的行数是r,列数是c,则 其中,我对第一项使用整数

我可以在迭代时以封闭形式编写此代码,如:

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

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

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

因此,第二个矩阵作为列主矩阵存储,对应的位置是通过交换行和列编号的
(i%3,i/3)


由于
Index=3*行+列
,因此总之,表示为
f(i)
的第二个矩阵的迭代索引是
3*(i%3)+(i/3)
,如果第一个矩阵中的行数是r,列数是c,则


其中,我对第一项使用整数除法,
%
*
的关联性在第二项中从左到右(
%
*
具有相同的优先级)

< P>一个显式地计算代换排列公式的替代方案是考虑列主要存储矩阵中属于同一行的元素的距离:

// 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;
}
//给定行和列作为矩阵的行数和列数
size\u t max\u index=行*cols-1;
对于(大小i=0,j=0;i最大索引)
j-=最大指数;
}

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

加上1,我的解决方案简化为3行3列。您可以只包含括号,而不必解释关联性(+1,但只需说).就我个人而言,我非常讨厌多余的括号。学习那张该死的桌子就像你小时候学习时间表一样!这是我教条式的放纵。但我同意,你的评论对更理性的人来说是有效的。我自己(我想)碰巧也很了解这个表,但仍然使用帕伦斯。与乘法表不同,有一个很好的解决方法可以让你忘记:)你是numpy dev吗?@MadPhysicast不,对不起。。。为什么?就是numpy开发者感兴趣的那种优化。这里介绍的是numpy如何处理n维数组的最基本版本。
// 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;
}