2

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

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

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

例如:

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

1 回答 1

3

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

  1. Mod(x,3)如果您的数字是 3 的倍数,则返回零mod(x,2)。如果 x 为奇数,则返回 1。
  2. 您可以通过键入来获取向量中的所有a1或值。只需键入 a.a1 就会一团糟。a2[a.a1]
  3. 您可以通过写作或写作来从您的a结构中过滤我们以获得相同的结果。a = a([1 3]);a = a(logical([1 0 1]))
  4. 您可以使用&for logical and|for 逻辑或(请参阅此处)。

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

%% 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);
于 2012-06-28T18:20:02.793 回答