matlab - MATLAB:从 3D 矩阵中提取索引以获取另一个 3D 矩阵
问题描述
我有两个相同大小的 3D 矩阵A
和B
,以及另一个相同大小的 3d 矩阵I
,其中包含与 的第一个维度对应的一些索引A
。我想做类似的事情A(I)/B(I)
。
具体来说,A(I(x,y,z),y,z)
将其除以B(I(x,y,z),y,z)
所有x,y,z
. 我如何快速做到这一点,也许使用repmat
或sub2ind
只是逻辑索引?
我知道如何非常有效地为 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);
解决方案
由于 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);
我想两者都会提高性能,但是运行其他一些计算我目前无法做任何事情。
推荐阅读
- session - 如何使用 hazelcast 会话复制获取 jetty servlet 中的所有会话?
- c# - 使用扩展方法时通过引用更改值
- android - 在 FragmentPagerAdapters 中,我应该使用带有标签的 FragmentManager,还是只使用 HashMap
? - sql-server - 无法在报表视图中加载客户端打印控件
- gams-math - 在 GAMS 中使用辛普森积分规则的问题
- angular - 如何附加标头以在 Angular 2 中获取 http?
- python - 将嵌套的 json 文件列表转换为 pandas 数据框
- sharepoint - Microsoft Graph 破坏 SharePoint 列表编号列值
- perl - 另一个数组中的数组perl
- angular - ng2-google-charts 没有显示正确的工具提示