首页 > 解决方案 > MATLAB:从 3D 矩阵中提取索引以获取另一个 3D 矩阵

问题描述

我有两个相同大小的 3D 矩阵AB,以及另一个相同大小的 3d 矩阵I,其中包含与 的第一个维度对应的一些索引A。我想做类似的事情A(I)/B(I)

具体来说,A(I(x,y,z),y,z)将其除以B(I(x,y,z),y,z)所有x,y,z. 我如何快速做到这一点,也许使用repmatsub2ind只是逻辑索引?

我知道如何非常有效地为 2D 矩阵执行此操作。如果没有z维度,我会这样做:

dum_i = I+(x_size+1).*repmat(0:(y_size-1), x_size+1, 1);  % Create a linear index
C= A(dum_i)./B(dum_i);

标签: matlabmatrixindexing

解决方案


由于 A 和 B 的大小相同,我假设您想要按元素划分./

%Some random test data
A=rand(3,4,5);
B=rand(size(A));
I=zeros(size(A));
for d2=1:size(I,2)
    for d3=1:size(I,3)
        I(:,d2,d3)=randperm(size(I,1));
    end
end
%end of test data

%Second and third dimension are to be indexed directly, use ind2sub to genertae matching indices
[~,I2,I3]=ind2sub(size(A),1:numel(A));
%Generate a linear index, which does "I(x,y,z),y,z"
LI=sub2ind(size(A),I(:),I2(:),I3(:));
%Make the index the right shape:
LI=reshape(LI,size(A));
%Now linear indexing can be used to permute A and B in the intended way.
C=A(LI)./B(LI);

要进一步提高性能,您可以:

  • ind2sub用一些 repmat 表达式替换该行。
  • 做“C=A/B,C=C(I)”。会是C2=A./B;C2=C2(LI);

我想两者都会提高性能,但是运行其他一些计算我目前无法做任何事情。


推荐阅读