继续: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
。
1052
7456
13933
边界823-1281不在任何其他值的2000之内,因此采用中点 - 反映原始值。下一个中间点在5260和9653之间,因为随着你的进展,每个连续的值都在它之前的值的2000之前,直到9653.然后应用相同的逻辑来获得12197和15670之间的中点。
是否有一种快速简便的方法来调整链接问题中的答案,以处理2列格式?
编辑(为了更清楚):
c
中保存的值可以被认为是划分'块的边界。坐在一条线上。检查每个边界以查看其中是否有任何东西(黑线)。
只要任何黑线触及红色块,整个红色块就会合并到同一个合并块中 - 完整。这就是计算出的第一个中点值为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
答案 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))