假设我们有两个升序排序向量:
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)
答案 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