【问题标题】:Fast general replacements for ind2sub and sub2ind MATLABind2sub 和 sub2ind MATLAB 的快速通用替换
【发布时间】:2020-07-12 06:19:45
【问题描述】:

奇怪的是,我找不到这个简单问题的一般答案。一个链接的答案here一般的。

sub2ind 可以避免,我相信,具有以下等价性 [here]

sub2ind(size(A), row1, row2, row3, row4) 相当于 row1+ (row2-1)*size(A,1) + (row3-1)*size(A,1) *size(A,2) + (row4-1)*size(A,1) *size(A,2) *size(A,3).

同时ind2sub 2 维(即没有row3, row4....)可以避免:

i = rem(index-1,size(A,1))+1;
j = (index-i)/size(A,1)+ 1 ;

相当于:

[i,j] = ind2sub(size(A),index);

我们如何将ind2sub 推广到 3D 矩阵等等?我对是否应该避免它的辩论不感兴趣。

【问题讨论】:

    标签: matlab indexing


    【解决方案1】:

    您的ind2sub 代码可以简单地通过在第二维上添加另一个rem 来概括:

    i = rem(index-1, size(A,1)) + 1;
    index = (index-i) / size(A,1) + 1;
    j = rem(index-1, size(A,2)) + 1;
    k = (index-i) / size(A,2) + 1;
    

    使用从零开始的索引实际上要容易得多,因为它消除了所有+1-1 位。这将是任意数量维度的通用代码:

    index = index-1; % convert to 0-based indexing
    sz = size(A);
    i = zeros(size(sz));
    for d = 1:numel(sz)
       i(d) = rem(index, sz(d));
       index = (index - i(d)) / sz(d);
    end
    i = i + 1; % convert back to 1-based indexing
    

    【讨论】:

    • Cris Luengo,恭喜你第一次发表我的问题,没有批评;)介意解释一下你的代码,尤其是后半部分?
    • @bissi,恭喜您提出不需要改进的第一个问题! :p
    • @bissi:后半部分的代码与您的 2D 代码完全一样,但在循环中。您的 j 是维度 2、3 等的线性索引(基本上,您已经沿着维度 1 分离出索引,j 是余数)。您现在可以通过从数组中删除第一个维度来重复相同的过程,并使用相同的计算沿维度 2 分离索引。您可以对每个剩余维度重复此过程。
    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    相关资源
    最近更新 更多