【问题标题】:Matlab: Indexing multidimensional array with a matrixMatlab:用矩阵索引多维数组
【发布时间】:2015-03-10 21:38:07
【问题描述】:

我有一个名为 Spr 的三维矩阵,大小为 5x5x500。最后一个维度代表个人,而前两个维度代表状态。因此,对于每个人,我存储了一个 5x5 矩阵,其中包含从状态 i 到状态 j 的转移概率。例如,最后一个个体的转移概率是:

Spr( : , : , 500)

ans =

0.1386    0.3768    0.2286    0.1871    0.0688
0.1456    0.3959    0.2401    0.1966    0.0218
0.1475    0.4011    0.2433    0.1992    0.0090
0.1486    0.4039    0.2450    0.2006    0.0020
     0    1.0000         0         0         0

我想访问三维矩阵 Spr,第一个索引由 500x1 矩阵 S 提供,该矩阵存储特定个人当前所处的状态。因此,我的最终结果将是一个 1x5x500 矩阵。例如,如果第 500 个人当前处于状态 S(i)=2,则此个人的相应行将对应于:

Spr(S(i),:,i)

0.1456    0.3959    0.2401    0.1966    0.0218 

如何在不使用循环的情况下做到这一点?

我曾尝试在 Matlab 中使用 sub2ind 函数,但它不起作用,因为它要求所有索引都是整数,而实际上我的第二个索引是字符 ":" 我>。

【问题讨论】:

    标签: arrays matlab multidimensional-array indexing vectorization


    【解决方案1】:

    只是为了满足“无循环”的要求:

    N=sum(bsxfun(@times,permute(full(sparse(S,1:numel(S),1)),[1,3,2]),Spr),1)
    

    诀窍是建立一个索引矩阵,使用times 选择正确的内容。 这个解决方案还可以,但我不喜欢它,因为它比使用 for 循环的更简单的解决方案更慢且内存效率更低:

    N=nan(1,size(Spr,2),size(Spr,3))
    for k=1:size(Spr,1)
        N(1,:,S==k)=Spr(k,:,S==k)
    end
    

    【讨论】:

    • 确实 for 循环看起来要简单得多。我需要将此操作嵌入到另一个 for 循环中,我担心嵌套循环会非常耗时。谢谢!
    猜你喜欢
    • 2014-02-21
    • 2017-02-24
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2015-11-08
    相关资源
    最近更新 更多