Matlab:用矩阵索引多维数组
Matlab: Indexing multidimensional array with a matrix
我有一个名为 Spr 的三维矩阵,大小为 5x5x500。最后一个维度代表个人,而前两个维度代表国家。因此,对于每个人,我存储了一个 5x5 的从状态 i 到状态 j 的转移概率矩阵。例如,最后一个人的转移概率是:
Spr( : , : , 500)
答案=
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 函数,但它不起作用,因为它要求所有索引都是整数,基本上我的第二个索引是字符 ":" .
只是为了满足 "no loops" 要求:
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
我有一个名为 Spr 的三维矩阵,大小为 5x5x500。最后一个维度代表个人,而前两个维度代表国家。因此,对于每个人,我存储了一个 5x5 的从状态 i 到状态 j 的转移概率矩阵。例如,最后一个人的转移概率是:
Spr( : , : , 500)
答案=
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 函数,但它不起作用,因为它要求所有索引都是整数,基本上我的第二个索引是字符 ":" .
只是为了满足 "no loops" 要求:
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