计算位于另一个矢量值之间的一个矢量的值

时间:2014-04-18 21:43:57

标签: matlab vector

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

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)

5 个答案:

答案 0 :(得分:4)

我无法相信没有人想到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)

答案 1 :(得分:1)

我认为这没有循环:

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

首先创建Vector

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找到这些位置并对这些位置进行差异处理,将V2之间的数字加上一个。

答案 2 :(得分:1)

bsxfun可以执行您需要的所有测试,然后您可以使用&(逐元素AND)对组合进行矢量化,并求和:

>> 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

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

答案 3 :(得分:1)

>> 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

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

答案 4 :(得分:0)

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