MATLAB爱好者论坛-LabFans.com

MATLAB爱好者论坛-LabFans.com (https://www.labfans.com/bbs/index.php)
-   资料存档 (https://www.labfans.com/bbs/forumdisplay.php?f=72)
-   -   如何在MATLAB中使用2-D遮罩索引3-D矩阵? (https://www.labfans.com/bbs/showthread.php?t=23756)

poster 2019-12-10 20:48

如何在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 我怀疑这里缺少明显的东西。 (:



[B]回答:[/B]

您可以通过使用[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/repmat.html"]REPMAT[/URL]在第三个维度上复制逻辑掩码M使其大小与D相同来实现。然后,索引掉:

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

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

[url=https://stackoverflow.com/questions/3407525]更多&回答...[/url]


所有时间均为北京时间。现在的时间是 01:08

Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.