【问题标题】:How to change all elements of struct array, which have certain field value?如何更改具有特定字段值的结构数组的所有元素?
【发布时间】:2015-10-29 09:56:18
【问题描述】:

假设我们有一个结构数组:

S=repmat(struct('a1',0,'a2', 0, 'a3', 0, ...), N, 1 );  

我需要将具有特定字段值的所有元素(例如字段 a1 = k)更改为具有该字段另一个值的元素(例如字段 a1 = m)。换句话说,如果S(i).a1 == k => S(i).a1 = m。而且我需要做得非常快,所以没有适合我的循环。我试图找到一个解决方案,这就是我发现的。命令:

S([S.a1]==k)

返回一个数组,其中包含字段 a1 等于 k ​​的所有元素。但是,如果我在这个数组中改变一些东西,当然,初始数组 S 不会发生任何事情。所以我尝试做明显的移动:

S([S.a1]==k).a1 = m

很遗憾,MATLAB 不明白这一点:

Insufficient outputs from right hand side to satisfy comma separated list expansion on left hand side.  Missing [] are the most likely cause.

(我试图将括号放在任何地方 - 没有帮助)

有没有什么方法可以在没有循环的情况下做到这一点(理想情况下,它应该尽可能快地工作)?可能是structfun 之类的东西?

提前致谢。

【问题讨论】:

  • 哈哈,好像你没有成功把括号到处放... :-)
  • 顺便说一下,structfunfor 循环更糟糕,因为它无论如何都是一个伪装 循环,并且您通过为每个元素调用一个函数来执行这些操作-- MATLAB 中的函数调用很昂贵。
  • @CST-Link 谢谢。 :)

标签: arrays matlab structure


【解决方案1】:

与您使用方括号包裹[S.a1] 以将多个输出连接成一个向量的方式相同,您需要包裹S([S.a1]==k).a1。然后,在 deal 函数的帮助下,您可以将单个输入 m 复制到多个输出。使用正确合成器的最终解决方案如下所示:

[S([S(:).a1]==k).a1]=deal(m)

【讨论】:

  • 谢谢你,真的帮了我。 :)
  • @Gickle 没问题。如果对您有用,请考虑 accepting the answer
猜你喜欢
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 1970-01-01
  • 2022-10-26
相关资源
最近更新 更多