【问题标题】:Transpose linear indices of a 2D matrix in matlab在matlab中转置二维矩阵的线性索引
【发布时间】: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

现在我有一些索引,比如714,我真的很想转置它们,所以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 的代码标记为正确,因为它可以放在单行中,并且可能比使用 rowcol 变量快 20000 次。

标签: matlab matrix indexing


【解决方案1】:

如果我正确理解你的问题,这就是你想要的:

sz = [4 5]; % size of original a
input_ind = [7 14]; % input linear indices
row_ind = mod(input_ind-1,sz(1))+1; % row indices from input linear indices
col_ind = floor((input_ind-1)/sz(1))+1; % column indices from input linear indices
output_ind = col_ind + (row_ind-1)*sz(2); % output linear indices, obtained using
    % col_ind as row indices, row_ind as column indices, and sz(2) instead of sz(1)

【讨论】:

  • 使用ind2subsub2ind 会更容易实现,因为一些奇怪的原因,OP 不想使用它们......
  • ind2subsub2ind 确实会产生一些开销,尽管可能很小
猜你喜欢
  • 2015-08-14
  • 1970-01-01
  • 2011-07-20
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多