我说我有
A=[1 3 4 5 6 7 9 12 15 16 17 18 20 23 24 25 26];
我感兴趣的是如何使用Matlab找到连续数字之间的中间值。
例如,第一组连续数字是
B=[3 4 5 6 7];
所以答案应该是5
。第二组连续数字(即[15 16 17 18]
)应该给16
等......
最后,我的最终答案是
[5 16 24]
答案 0 :(得分:3)
这是一种矢量化方法:
d = [diff(A) == 1, 0];
subs = cumsum([diff(d) == 1, 0]).*(d | [0, diff(d) == -1]) + 1
temp = accumarray(subs', A', [], @median)
final = floor(temp(2:end))
答案 1 :(得分:2)
以下是一些示例代码,可以满足您的需求。我会让你玩不同的输出来看他们到底做了什么,虽然我写了一些评论:
clear
clc
A=[1 3 4 5 6 7 9 12 15 16 17 18 20 23 24 25 26]
a=diff(A); %// Check the diff array to identify occurences different than 1.
b=find([a inf]>1);
NumElements=diff([0 b]); %//Number of elements in the sequence
LengthConsec = NumElements((NumElements~=1)) %// Get sequences with >1 values
EndConsec = b(NumElements~=1) %// Check end values to deduce starting values
StartConsec = EndConsec-LengthConsec+1;
%// Initialize a cell array containing the sequences (can have ifferent
%lengths, i.e. an array is not recommended) and an array containing the
%median values.
ConsecCell = cell(1,numel(LengthConsec));
MedianValue = zeros(1,numel(LengthConsec));
for k = 1:numel(LengthConsec)
ConsecCell{1,k} = A(StartConsec(k):1:EndConsec(k));
MedianValue(k) = floor(median(ConsecCell{1,k}));
end
%//Display the result
MedianValue
给出以下内容:
MedianValue =
5 16 24
答案 2 :(得分:1)
diff + strfind
的方法 -
loc_consec_nums = diff(A)==1 %// locations of consecutive (cons.) numbers
starts = strfind([0 loc_consec_nums],[0 1]) %// start indices of cons. numbers
ends = strfind([loc_consec_nums 0],[1 0]) %// end indices of cons. numbers
out = A(ceil(sum([starts ; ends],1)./2))%// median of each group of starts and ends
%// and finally index into A with them for the desired output