【问题标题】:Efficiently filtering a MATLAB struct array?有效地过滤 MATLAB 结构数组?
【发布时间】:2012-06-28 17:56:55
【问题描述】:

假设我在 MATLAB 中有一个结构体数组:

a= struct('a1',{1,2,3},'a2',{4,5,6})

如何有效地(即使用矢量化代码)过滤结构的元素,使它们满足一些布尔属性?

例如:

  1. 如何创建一个新的结构数组 b,其元素是 a 的子集,其中 both a1 是 3 的倍数 @987654325 @ 是 3 的倍数?预期结果是一个大小为 1 的结构数组,其元素为 struct('a1', 3, 'a2', 6)
  2. 如何创建一个新的结构数组b,其元素是a 的子集,其中a1 是奇数 a2 是3 的倍数?预期结果是以下大小为 2 的结构数组:struct('a1', {1,3}, 'a2', {4,6})

【问题讨论】:

    标签: arrays matlab struct vectorization slice


    【解决方案1】:

    您可以通过 mod(...) 函数和正确使用括号和引用来解决这个问题。考虑

    1. 如果您的数字是 3 的倍数,Mod(x,3) 将返回 0。如果 x 为奇数,mod(x,2) 将返回 1。
    2. 您可以通过键入[a.a1] 来获取向量中的所有a1a2 值。只需键入 a.a1 就会一团糟。
    3. 您可以通过编写 a = a([1 3]); 或编写 a = a(logical([1 0 1])) 从您的 a 结构中过滤我们以获得相同的结果。
    4. 您可以将& 用于逻辑与,将| 用于逻辑或(see here)。

    总之,以下代码可以解决您的问题:

    %% Part 1:
    a= struct('a1',{1,2,3},'a2',{4,5,6});
    logForA1isMod3 = (mod([a.a1], 3) == 0);
    logForA2isMod3 = (mod([a.a2], 3) == 0);
    
    a = a(logForA1isMod3  & logForA2isMod3);
    
    %% Part 2:
    a= struct('a1',{1,2,3},'a2',{4,5,6});
    logForA1isOdd = (mod([a.a1], 2) == 1);
    
    a = a(logForA1isOdd | logForA2isMod3);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多