【问题标题】:matlab indexing with multiple condition具有多个条件的matlab索引
【发布时间】:2014-03-17 09:32:06
【问题描述】:

我不知道如何根据多个其他向量的条件创建向量。我有三个向量,如果其他向量上的值符合条件,我需要一个向量的值。 作为下面的示例,我想从向量a 中选择值,如果向量b==2 上的值和向量c==0 上的值显然我期望[2 4]

a = [1 2 3 4 5 6 7 8 9 10];
b = [1 2 1 2 1 2 1 2 1 2];
c = [0 0 0 0 0 1 1 1 1 1]

我的想法是这样的:

d = a(b==2) & a(c==0)

但我有d = 1 1 1 1 1 不知道为什么。 这似乎是基本问题,但我可以找到解决方案。

【问题讨论】:

    标签: matlab indexing


    【解决方案1】:

    在您的情况下,您可以考虑使用a(b==2 & c==0)

    【讨论】:

    • 你能告诉我 a(b==2) & a(c==0) 产生什么吗?
    • 在您的情况下,b==2 返回一个逻辑值向量,指示是否满足相等性。这个向量可以用来访问a的对应元素: b==2 --> [0 1 0 1 0 1 0 1 0 1] c==0 --> [1 1 1 1 1 0 0 0 0 0 ] (b==2) & (c==0) --> [0 1 0 1 0 0 0 0 0 0] a((b==2) & (c==0)) --> [2 , 4] 请注意,您需要布尔索引才能以这种方式访问​​ a 的元素。因此,您不能使用例如 a([1 1 1 0 0 0 0 1 0 0 0]) 因为在这种情况下 1 和 0 是实数,而 Matlab 期望逻辑运算符或“逻辑”变量的结果。跨度>
    • 在你的情况下,你有a(b==2) --> [2 4 6 8 10]a(c==0) --> [1 2 3 4 5],然后你计算两个向量的“与”,如果对应的元素不为零,则为真(1),否则为假(0) 如果至少一个元素为零。因此:[2&1, 4&2, 6&3, 8&4, 10&5]-->[1 1 1 1 1].
    【解决方案2】:

    使用ismember 在连接bc 之后沿行查找匹配的索引,然后索引到a

    代码

    a(ismember([b;c]',[2 0],'rows'))
    

    输出

    ans =
    
         2
         4
    

    您也可以使用bsxfun 来获得相同的结果 -

    a(all(bsxfun(@eq,[b;c],[2 0]'),1))
    

    或者你可以调整你的方法以获得正确的结果 -

    a(b==2 & c==0)
    

    【讨论】:

      猜你喜欢
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-04
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      相关资源
      最近更新 更多