接下来的内容:检测任何值是否在彼此的某个值之内-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
可以将保留的值视为划分在线上“块”的边界。检查每个边界以查看是否有任何边界在其2000范围内(黑线)。
一旦任何一条黑线碰到一个红色块,则整个红色块将全部合并到同一合并块中。这就是为什么计算出的第一个中点值为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
看看这是否适合您-
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))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句