c-有效地迭代转置矩阵的连续元素(通过位运算符)



让我们考虑一下内部表示为一维数组的矩阵。例如,矩阵(3,4)实际上是一个数组(比如double类型)或3*4个元素。以下是矩阵的"内存布局":

00 01 02 03
04 05 06 07
08 09 10 11

因此,很容易对矩阵的所有元素进行迭代(逐行,从左到右):它只是一个从0到11的32位整数。这就是转置的样子:

00 04 08
01 05 09
02 06 10
03 07 11

什么是一种(快速)算法,将表示转置矩阵第i个元素的单个32位整数(逐行,从左到右)作为输入,返回与内部表示相对应的索引?我所说的single是指"增量"算法不是我想要的,该函数只接受一个32位整数(加上行和列的数量)作为输入,并输出一个32位数的整数。我提到了位运算符,因为它可能是解决问题的最快方法,但任何有效的解决方案都足够了。在上面的例子中:

0 --> 0
1 --> 4
2 --> 8
3 --> 1
4 --> 5
5 --> 9
6 --> 2
...

此外,需要对行和列的数量施加什么限制(如果有的话)(我们已经有了num_row*num_col适合32位整数),这样算法才能保证工作。

谢谢!

只要维度保持较小,就可以使用常量作为查找表:

0x4cd0b73a62951840 >> (x*4)) & 15

如果它们变得稍微大一点,你可以将其划分为例如生成结果的高位和低位:

((0x00fea540 >> (x*2)) & 3) | (((0x00924924 >> (x*2) & 3) << 2))

但最终,直截了当的方法会更快。

最新更新