检测值是否在彼此的范围内并取中点 - MATLAB

时间:2015-03-05 16:42:23

标签: matlab

继续:Detecting if any values are within a certain value of each other - MATLAB

我目前正在使用randi生成一个随机数,然后我从中减去并添加第二个数字 - 使用poissrnd生成:

for k=1:10
a = poissrnd(200,1);
b(k,1) = randi([1,20000]);
c(k,1:2) = [b(k,1)-a,b(k,1)+a];
end
c = sort(c);

c以这种格式提供输出:

823     1281
5260    5676
5372    5760
5379    5779
6808    7244
6869    7293
9203    9653
12197   12563
14411   14765
15302   15670

a中选择的点周围的边界+/- b

然后,我想设置一个额外的变量(即d = 2000),该变量用作匹配然后合并值的阈值。为此考虑边界 - 当d = 2000时,上述值的输出将是:

1052
7456
13933

边界823-1281不在任何其他值的2000之内,因此采用中点 - 反映原始值。下一个中间点在5260和9653之间,因为随着你的进展,每个连续的值都在它之前的值的2000之前,直到9653.然后应用相同的逻辑来获得12197和15670之间的中点。

是否有一种快速简便的方法来调整链接问题中的答案,以处理2列格式?

编辑(为了更清楚):

c中保存的值可以被认为是划分'块的边界。坐在一条线上。检查每个边界以查看其中是否有任何东西(黑线)。

enter image description here

只要任何黑线触及红色块,整个红色块就会合并到同一个合并块中 - 完整。这就是计算出的第一个中点值为1052的原因 - 从前两个边界发出的两条黑线没有触及任何东西。然而,下一组块彼此接触。这将它们全部合并到合并中,使得中点在9653和5260 = 7456之间。

从12197开始的区块在它之前是不可及的,因此它保持分离。我没有显示所有的块。

编辑2 @Esteban:

b =
849
1975
8336
9599
12057
12983
13193
13736
16887
18578

c =
662     1036
1764    2186
8148    8524
9386    9812
11843   12271
12809   13157
12995   13391
13543   13929
16687   17087
18361   18795

然后您的脚本会生成结果:

8980
12886
17741

实际上它应该是:

1424
8980
12886
17741

所以它只是缺少第一个值 - 如果没有发生合并,则只在两个值之间取中点。有时这似乎有效 - 有时候它没有。

例如,这里有效(当值设置为1000而不是2000作为测试时):

c = 
2333    2789
5595    6023
6236    6664
10332   10754
11425   11865
12506   12926
12678   13114
15105   15517
15425   15797
19490   19874

result = 
2561
6129
11723
15451
19682

2 个答案:

答案 0 :(得分:1)

不是100%确定它是否适用于所有样品......但这是我提出的代码,它至少与您示例中的数据一起使用:

value=2000;

indices = find(abs(c(2:end,1)-c(1:end-1,2))>value);
indices = vertcat(indices, length(c));

li = indices(1:end-1)+1;
ri = indices(2:end);
if li(1)==2
    li=vertcat(1,li);
    ri=vertcat(1,ri);
end

result = floor((c(ri,2)+c(li,1))/2)

它不是很干净,肯定可以用更少的线条完成,但它很容易理解并且有效,而且由于你的c很小,我不认为有必要进一步优化它,除非你要运行它有数百万的时间。

答案 1 :(得分:1)

看看这是否适合你 -

th = 2000   %// threshold

%// Column arrays
col1 = c(:,1)
col2 = c(:,2)

%// Position of "group" shifts
grp_changes = diff([col2(1:end-1,:) col1(2:end,:)],[],2)>th

%// Start and stop positions of shifts
stops = [grp_changes ; 1]
starts = [1 ; stops(1:end-1)]

%// Finally the mean of shift positions, which is the desired output
out = floor(mean([col1(starts~=0) col2(stops~=0)],2))