Matlab 一个向量的计数值位于另一个向量的值之间
假设我们有两个升序排序向量:Matlab 一个向量的计数值位于另一个向量的值之间,matlab,vector,Matlab,Vector,假设我们有两个升序排序向量: V1 V2 12 13 15 16 25 17 29 28 在Matlab中,计算V2的值在V1的连续值之间的最简单方法是什么 在本例中,结果向量应为: Counts 1 2 1 自 V1=[12,15,25,29]; V2=[13,16,17,28]; V3=零(1,长度(V1)-1); 计数=0; 对于i=1:长度(V1)-1 对于k=1:长度(V2) 如果(V2(k)>V1(i)和&V2(k)V1=[12,15,25,29]; V2=[13,16,17,2
V1 V2
12 13
15 16
25 17
29 28
在Matlab中,计算V2
的值在V1
的连续值之间的最简单方法是什么
在本例中,结果向量应为:
Counts
1
2
1
自
V1=[12,15,25,29];
V2=[13,16,17,28];
V3=零(1,长度(V1)-1);
计数=0;
对于i=1:长度(V1)-1
对于k=1:长度(V2)
如果(V2(k)>V1(i)和&V2(k)V1=[12,15,25,29];
V2=[13,16,17,28];
V3=零(1,长度(V1)-1);
计数=0;
对于i=1:长度(V1)-1
对于k=1:长度(V2)
如果(V2(k)>V1(i)和&V2(k)我认为这在没有循环的情况下是可行的:
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中的数字保留在它们之间加上一。我认为这样做没有循环:
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中的数字加上一。bsxfun
可以完成您需要的所有测试,然后您可以使用和(元素和)对组合进行矢量化,并求和:
>> 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
>low=bsxfun(@lt,V1,V2.);%V1的每一行>高=bsxfun(@gt,V1,V2.);%V1的每一行>V2的每一行
>>总和(低(1:end-1,:)和高(2:end,:),2)
ans=
1.
2.
1.
注意:要检查=
而不是
,请使用@ge
(而不是@gt
)。同样地,对于
可以执行您需要的所有测试,然后可以使用&
(元素和)对组合进行矢量化,并求和:
>> 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
>low=bsxfun(@lt,V1,V2.);%V1的每一行>高=bsxfun(@gt,V1,V2.);%V1的每一行>V2的每一行
>>总和(低(1:end-1,:)和高(2:end,:),2)
ans=
1.
2.
1.
注意:要检查>=
而不是
,请使用@ge
(而不是@gt
)。对于
魔术!!没有循环
但逻辑很容易理解
以行向量代替列向量为例
我首先创建一个v1、v2组合的排序列表
所以
这是关键的一步,我将v1的成员设为v4中的1,其余的为0
>> v4 = ismember(v3,v1)
v4 =
1 0 1 0 0 1 0 1
在这一点上,问题几乎解决了,我需要找到零组和它们的长度
>> diff(find(v4 == 1)) - 1
ans =
1 2 1
无循环,运行时间更短
魔术!!没有循环
但逻辑很容易理解
以行向量代替列向量为例
我首先创建一个v1、v2组合的排序列表
所以
这是关键的一步,我将v1的成员设为v4中的1,其余的为0
>> v4 = ismember(v3,v1)
v4 =
1 0 1 0 0 1 0 1
在这一点上,问题几乎解决了,我需要找到零组和它们的长度
>> diff(find(v4 == 1)) - 1
ans =
1 2 1
没有循环,运行时间更短。我不敢相信还没有人想到:
给,在这种情况下
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)
计数=
v2的1%//1值大于等于v1(1)且小于v1(2)
2%//v2的2个值为>=v1(2)和
我不敢相信还没有人想到:
给,在这种情况下
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)
计数=
v2的1%//1值大于等于v1(1)且小于v1(2)
2%//v2的2个值为>=v1(2)和