【发布时间】:2021-09-11 15:24:25
【问题描述】:
我想有效地转置我的二维矩阵的线性索引,并且我努力想出高效的代码来做到这一点(见下文我的次优解决方案)。如何尽可能高效地完成这项工作(RAM 无关紧要,只是速度)?
假设我们有一个二维矩阵a:
a = [1:4;5:8;9:12;13:16;17:20]'
a =
1 5 9 13 17
2 6 10 ->14<- 18
3 >7< 11 15 19
4 8 12 16 20
现在我有一些索引,比如7 和14,我真的很想转置它们,所以7 (3,2) 的索引变成12 (2,3) 和14 (4,2) 变为 9(2,4)。
>> a'
ans =
1 6 11 16
2 7 >12< 17
3 8 13 18
4 ->9<- 14 19
5 10 15 20
现在,我用了一些愚蠢的东西:
tmp = zeros(size(a));
tmp([7 14])=1; %mark linear indices as '1' in the matrix
tmp=tmp'; %transpose the whole matrix
solution = find(tmp);
%then some sorting...
solution =
9
12
(显然,使用ind2sub 可以简单地获取索引,然后翻转它们。我正在寻找一种更有效的解决方案,我可以直接转换索引,而不需要额外的变量)
【问题讨论】:
-
我找到了this solution,但没有设法实现它。抱歉,如果之前有人问过这个问题,我真的找不到。
-
我发现“
a'”部分令人困惑,因为您在下面显示的实际上并不是a'。考虑改写你的问题 -
“我正在寻找一种更有效的解决方案,我可以直接转换索引,而不需要额外的变量。”这个计算太慢了吗?这真的是你程序的瓶颈吗?还是您不想让中间变量污染您的命名空间?后一个问题通过创建一个执行计算的函数来解决。
-
@CrisLuengo 计算只执行了 20000 次。由于索引每次都是伪随机移动,然后发生这种转换,我希望它尽可能快。重新编写代码,以便在转换之后发生转变会更有效率,但我现在才想到这个(在休息并写下这个问题之后 - 道歉)。将 Luis Mendo 的代码标记为正确,因为它可以放在单行中,并且可能比使用
row和col变量快 20000 次。