【发布时间】:2014-03-05 12:29:17
【问题描述】:
让我们考虑内部表示为一维数组的矩阵。 例如,matrix(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
什么是(快速)算法,它以 单个 32 位整数作为输入,表示转置矩阵的第 i 个元素(逐行,从左到右)返回对应的索引到内部表示?单个我的意思是“增量”算法不是我想要的,该函数只是将一个 32 位整数(加上行数和列数)作为输入并输出一个 32 位整数。我提到了按位运算符,因为它可能是解决问题的最快方法,但任何有效的解决方案都足够了。 在上面的例子中:
0 --> 0
1 --> 4
2 --> 8
3 --> 1
4 --> 5
5 --> 9
6 --> 2
...
此外,需要对行数和列数施加什么限制(如果有)(我们已经将 num_row*num_col 放入 32 位整数中),以保证算法能够正常工作。
谢谢!
【问题讨论】:
-
视情况而定。如果矩阵在两个维度上都是 2 的幂,则很容易(只需交换两个位域)。否则,就有问题了。
-
其中“有问题的”是
j = i / c; k = i % c; return k * r + j;,尽管存在分歧,但它并没有留下很大的改进空间。如果您使用无符号类型并且c和r在编译时已知是 2 的常数幂,则编译器可能会派生旋转位的版本。 -
我怀疑 2 的幂会更容易,但我正在为任意维度的情况寻找通用解决方案。
-
顺便说一句,除了最后一个元素,我似乎可以为每个索引使用一个 '%' 和一个 ''(前提是 rc 是预先计算的),但是我担心溢出的可能性。
-
即乘以 r 和 mod out 乘以 rc-1,这会将 0 和 rc-1 都映射到 0。如果您的目标是 x86,您最可能不会为具有相同除数的 / 和 % 支付两次费用。
标签: c algorithm bit-manipulation