【问题标题】:Counting values of one vector that lie in between the values of another vector计算位于另一个向量值之间的一个向量的值
【发布时间】:2014-04-18 21:43:57
【问题描述】:

假设我们有两个升序排序的向量:

V1 V2
12 13
15 16
25 17
29 28

Matlab 中计算有多少 V2 的值落在 V1 的连续值之间的最简单方法是什么?

在本例中,结果向量应为:

Counts
1
2
1

因为

1 - 13(V2) fits between 12-15(V1)

2 - 16 and 17(V2) fits between 15-25(V1)

1 - 28(V2) fits between 25-29(V1)

【问题讨论】:

    标签: matlab vector


    【解决方案1】:

    我不敢相信还没有人想到histc

    count = histc(v2,v1);
    

    给出,在这种情况下

    count =
         1 %// 1 value  of v2 is  >= v1(1) and < v1(2)
         2 %// 2 values of v2 are >= v1(2) and < v1(3)
         1 %// 1 value  of v2 is  >= v1(3) and < v1(4)
         0 %// 0 values of v2 are == v1(4)
    

    【讨论】:

      【解决方案2】:

      我认为这无需循环即可:

      V1 = [12 15 25 29]';
      V2 = [13 16 17 28]';
      
      
      V3 = [V1 zeros(size(V1)); V2 ones(size(V2))];
      V4 = sortrows(V3);
      
      ret = diff(find(V4(:,2)==0))-1
      

      这首先创建了向量

      V3 =
      
         12    0
         15    0
         25    0
         29    0
         13    1
         16    1
         17    1
         28    1
      

      然后排序

      V4 =
      
         12    0
         13    1
         15    0
         16    1
         17    1
         25    0
         28    1
         29    0
      

      现在零的位置标记了 V1 中的下一个条目。 find 找到这些位置并 diff 减去这些位置,使 V2 中的数字在它们之间加一。

      【讨论】:

        【解决方案3】:

        bsxfun 可以做所有你需要的测试,然后你可以用&amp; 向量化组合(元素与),然后求和:

        >> low = bsxfun(@lt,V1,V2.');    %' each row of V1 < each row of V2
        >> high = bsxfun(@gt,V1,V2.');   %' each row of V1 > each row of V2
        >> sum(low(1:end-1,:) & high(2:end,:),2)
        ans =
             1
             2
             1
        

        注意:要检查&gt;= 而不是&gt;,请使用@ge(而不是@gt)。对于&lt;=&lt;,同样使用@le@lt

        【讨论】:

          【解决方案4】:
          >> v1 = [12    ;15    ;25    ;29];
          >> v2 = [13    ;16    ;17    ;28];
          >> diff(find(ismember(sort([v1 ;v2]),v1) == 1))  - 1
          ans =
          
               1     
               2     
               1
          

          魔法!!没有循环!!

          但逻辑很容易理解

          以行向量代替列向量为例

          我首先创建一个 v1、v2 组合的排序列表 所以

          >> v3 = sort([v1 v2])
          
          v3 =
          
              12    13    15    16    17    25    28    29
          

          那么这是关键步骤,我在v4中将v1的成员设为1,其余的设为0。像这样

          >> v4 = ismember(v3,v1)
          
          v4 =
          
               1     0     1     0     0     1     0     1
          

          至此,问题基本解决了,我需要找到零的组和它们的长度

          >> diff(find(v4 == 1)) - 1
          
          ans =
          
               1     2     1
          

          没有循环,运行时间更短。

          【讨论】:

            【解决方案5】:
            V1 = [12,15,25,29];
            V2 = [13,16,17,28];
            V3 = zeros(1,length(V1)-1);
            count = 0;
            
            for i = 1:length(V1)-1
                for k = 1:length(V2)
                    if(V2(k)>V1(i) && V2(k)<V1(i+1))
                        count = count+1;
                    end
            
                end
                V3(i) = count;
                count = 0;
            end
            
            V3
            

            【讨论】:

              猜你喜欢
              • 2015-01-02
              • 2019-04-19
              • 1970-01-01
              • 1970-01-01
              • 2011-04-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多