【问题标题】:How do I delete all-zero pages from a 3D matrix in a loop?如何在循环中从 3D 矩阵中删除全零页面?
【发布时间】:2020-12-04 09:43:42
【问题描述】:

如何在循环中从 3D 矩阵中删除全零页面?

我想出了下面的代码,虽然它不是“完全”正确的,如果有的话。我正在使用 MATLAB 2019b。

%pseudo data
x = zeros(3,2,2);
y = ones(3,2,2);
positions = 2:4;
y(positions) = 0;

xy = cat(3,x,y); %this is a 3x2x4 array; (:,:,1) and (:,:,2) are all zeros, 
                 % (:,:,3) is ones and zeros, and (:,:,4) is all ones
                 

%my aim is to delete the arrays that are entirely zeros i.e. xy(:,:,1) and xy(:,:,2),
%and this is what I have come up with; it doesn't delete the arrays but instead,
%all the ones.
for ii = 1:size(xy,3)
    
    for idx = find(xy(:,:,ii) == 0)

        xy(:,:,ii) = strcmp(xy, []); 

    end
    
end

【问题讨论】:

  • 这不是一个好的编辑。这个问题看起来不再一样了,似乎使发布的答案无效。它也不是minimal reproducible example
  • 抱歉,我的目的不是让任何人的努力无效,我非常感谢您的所有帮助。
  • 请不要过分改变问题的含义,尤其是在发布答案之后。如果您在阅读这些答案后有问题,请提出新问题。如果其中一个答案对您有所帮助,请考虑使用投票箭头下方的复选标记接受它,这表明您不再需要帮助。

标签: arrays matlab for-loop multidimensional-array


【解决方案1】:

我不确定您希望您的代码做什么,特别是考虑到您正在比较全数字数组中的字符串。这是一段代码,可以满足您的需求:

x = zeros(3,2,2);
y = ones(3,2,2);
positions = 2:4;
y(positions) = 0;

xy = cat(3,x,y);

idx = ones(size(xy,3),1,'logical');  % initialise catching array
for ii = 1:size(xy,3)
   if sum(nnz(xy(:,:,ii)),'all')==0  % If the third dimension is all zeros
       idx(ii)= false;  % exclude it
   end
end

xy = xy(:,:,idx);  % reindex to get rid of all-zero pages

这里的诀窍是,如果给定页面(第三维)上的所有元素都为零,sum(xy(:,:,ii),'all')==0 为零。在这种情况下,将其从idx 中排除。然后,在最后一行中,只需使用 logical indexing 重新索引以仅保留至少包含一个非零元素的页面。

您可以使用sum(a,[1 2]) 更快地完成,无需循环,即矢量维和:

idx = sum(nnz(xy),[1 2])~=0;
xy = xy(:,:,idx);

【讨论】:

  • 这假定 xy 包含 >=0 值。你可以对逻辑 xy 求和来解决这个问题
  • @SardarUsama 不一定;它假设没有例如-1, 1 和更多的零。感谢您的关注,我使用 nnz 添加了故障保护
【解决方案2】:

使用any 查找具有至少一个非零值的切片的索引。使用这些索引来提取所需的结果。

idx = any(any(xy));   % idx = any(xy,[1 2]); for >=R2018b
xy = xy(:,:,idx);

【讨论】:

  • 我认为 OP 想要全零页面,所以应该用 all(...) 替换 any(...)
  • @Justin OP 想要删除全零页面。如果您使用all 而不是any,您将只获得所有非零值的页面。换句话说,使用all,至少有一个但不是全零的页面也将被删除。
  • 我已更新我的问题以提供更多信息。我会按照您的建议尝试使用“任何”,并会回复。
  • 已更新;希望它是最小的和可重复的。
  • @CinelliT 哪个数组相当于您编辑中的 3D 数组 xy
猜你喜欢
  • 2017-07-15
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-26
  • 1970-01-01
相关资源
最近更新 更多