查看单个帖子
旧 2019-12-10, 20:48   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 如何在MATLAB中使用2-D遮罩索引3-D矩阵?

假设我有D,一个X-Y-Y-Z数据矩阵。我也有M,一个X x Y的“遮罩”矩阵。我的目标是在M中的(Xi,Yi)为假时将D中的元素(Xi,Yi,:)设置为NaN。

有什么办法可以避免循环执行此操作?我尝试使用ind2sub ,但是失败了:

M = logical(round(rand(3,3))); % mask D = randn(3,3,2); % data % try getting x,y pairs of elements to be masked [x,y] = ind2sub(size(M),find(M == 0)); D_masked = D; D_masked(x,y,:) = NaN; % does not work! % do it the old-fashioned way D_masked = D; for iX = 1:size(M,1) for iY = 1:size(M,2) if ~M(iX,iY), D_masked(iX,iY,:) = NaN; end end end 我怀疑这里缺少明显的东西。 (:



回答:

您可以通过使用REPMAT在第三个维度上复制逻辑掩码M使其大小与D相同来实现。然后,索引掉:

D_masked = D; D_masked(repmat(~M,[1 1 size(D,3)])) = NaN; 如果不希望复制掩码矩阵,则还有另一种选择。您可以首先找到一组线性索引,其中M等于0,然后复制该集合的size(D,3)次,然后将每组索引移位numel(M)的倍数,以便在D中索引D的不同部分第三维。我将在这里使用BSXFUN进行说明

D_masked = D; index = bsxfun(@plus,find(~M),(0:(size(D,3)-1)).*numel(M)); D_masked(index) = NaN;

更多&回答...
poster 当前离线   回复时引用此帖