【问题标题】:Logical Masking in Matlab - How to (instantly) index concatenated Matlab array?Matlab 中的逻辑屏蔽 - 如何(立即)索引连接的 Matlab 数组?
【发布时间】:2019-06-13 13:13:45
【问题描述】:

数据结构:

我有一个结构数组s,其中包含多个字段s.xs.ys.z。 请考虑结构的以下结构属性!:

(1) 同一行中的字段具有相同大小的单个向量:

length(s(i).x)=length(s(i).y)=length(s(i).z)

(2) 字段中的单个向量的大小可能因行而异:

length(s(i).x)~=length(s(j).x)
length(s(i).y)~=length(s(j).y)
length(s(i).z)~=length(s(j).z)

问题:

我想根据其中一个字段创建一个逻辑掩码,例如s.z 并将其应用于整个结构数组。一种方法是执行以下操作:

mask = [s.z] > 0;
s_concatenated = [s.x; s.y; s.z]';
mask_applied2struct = s_concatenated(mask);

现在我的问题是是否有办法在 Matlab 中将逻辑掩码应用到结构数据类型?也许在以下时尚中,例如:

mask_applied2struct = s([s.z] > 0)

mask_applied2struct = [s]([s.z] > 0)

所以,基本上我对连接结构并对其应用掩码的即时方式感兴趣。

提前致谢!

【问题讨论】:

  • 为什么不s_concatenated = [s.dx(mask); s.dy(mask); s.dz(mask)]';
  • 因为连接会删除我的数据结构

标签: matlab indexing struct concatenation mask


【解决方案1】:

您可以使用structfun 将函数应用于结构的每个字段。 structfun基本上是一个隐藏的for循环。

例子:

%random structure with size(x) = size(y) = size(z)
s.x = round(rand(4,4)*2-1);
s.y = round(rand(4,4)*2-1);
s.z = round(rand(4,4)*2-1);

%create a logical mask
mask = s.x>=0;

%apply the mask to each field
s_new = structfun(@(p) p(mask),s,'UniformOutput',0)

【讨论】:

  • 谢谢! 但请考虑我的(关键)编辑! - 使用我的数据结构,我在创建掩码时收到以下错误。给您(使用 mask = s.x>=0;):“使用 >= 输入参数过多时出错。”
  • @AliakbarAhmadi:此代码适用于 scalar 结构,如果您的结构有多个元素,则需要在这些元素上编写另一个循环:for ii=1:numel(s); apply code over s(ii); end。 -- 请不要说“但是循环很慢”,它们不是!
  • 但是循环很慢:D
猜你喜欢
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2016-08-28
相关资源
最近更新 更多