Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 高效过滤MATLAB结构阵列?_Arrays_Matlab_Struct_Vectorization_Slice - Fatal编程技术网

Arrays 高效过滤MATLAB结构阵列?

Arrays 高效过滤MATLAB结构阵列?,arrays,matlab,struct,vectorization,slice,Arrays,Matlab,Struct,Vectorization,Slice,假设我在MATLAB中有一个结构数组: a= struct('a1',{1,2,3},'a2',{4,5,6}) 如何有效地(即使用矢量化代码)过滤结构的元素,使其满足某些布尔属性 例如: 如何创建一个新的结构数组b,其元素是a的子集,其中和a1都是3的倍数和a2都是3的倍数?预期结果是一个大小为1的结构数组,其元素为struct('a1',3',a2',6) 我如何创建一个新的结构数组b,其元素是a的子集,其中a1是奇数或a2是3的倍数?预期结果是以下大小为2的结构数组:struct('a1

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

a= struct('a1',{1,2,3},'a2',{4,5,6})
如何有效地(即使用矢量化代码)过滤结构的元素,使其满足某些布尔属性

例如:

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

  • 您可以通过mod(…)函数以及正确使用括号和引用来解决此问题。考虑

  • Mod(x,3)
    如果您的数字是3的倍数,将返回零<如果x为奇数,则code>mod(x,2)将返回1
  • 您可以通过键入
    [a.a1]
    来获取向量中的所有
    a1
    a2
    值。只需键入a.a1,就会造成混乱
  • 您可以通过编写
    a=a([13]),从
    a
    结构中过滤我们的代码
    或通过写入
    a=a(逻辑([1 0 1])
    来获得相同的结果
  • 您可以将
    &
    用于逻辑and,将
    |
    用于逻辑or()
  • 总之,以下代码解决了您的问题:

    %% 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);