Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 一个向量的计数值位于另一个向量的值之间_Matlab_Vector - Fatal编程技术网

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