计算 MATLAB 中连续整数序列的长度
Count lengths of sequences of consecutive integers in MATLAB
我想计算连续整数序列的所有长度,return 将它们作为向量计算。
例如,考虑向量:
x = [1 2 3 4 6 8 9 10 12 13];
长度为:
length([1 2 3 4]) = 4;
length([6]) = 1;
length([8 9 10]) = 3;
length([12 13]) = 2;
所以,我要生成的结果是:
y = [4 1 3 2]
我怎样才能做到这一点?
这等于x - (1:length(x))
的run lengths。因此你可以使用:
runLengths = @(x) diff([0, reshape(find(x(1:end-1)~=x(2:end)),1,[]), numel(x)]);
sequenceCounts = @(x) runLengths(x(:)-(1:numel(x)).');
result = sequenceCounts(x);
这应该可以解决问题:
y = diff(find(diff([nan ; x(:) ; nan]) ~= 1))
里面的diff
寻找的是不是+1(断序)的步骤,find
确定对应的位置(索引), outer diff
计算序列长度作为序列中断位置之间的差异。 nan
用于确保找到向量开头的序列和结尾的序列,方法是引入不同于 1 的 diff
值。
x = [1 2 3 4 6 8 9 10 12 13];
consecs = []; % empty vector to store answers
consec = 1; % initialize
for I=2:length(x)
if x(I)==x(I-1)+1 % this one is consecutive with previous
consec = consec+1;
else % this one starts a new set of consecutives
consecs(end+1) = consec;
consec = 1;
end
end
consecs(end+1)=consec; % remember to include the last consecutives
display(consecs)
这已经过测试并且有效。
的一个小变体:
- 使用
diff
检测大于 1 的差异。这会在每个 运行 的 end 处给出一个 1
值。
- 向后累积(使用
cumsum
)为每个 运行 分配不同的数字标签。向后累加是因为步骤 1 中的 1
值在每个 运行 的末尾,而不是在开头。
- 用
histc
计算运行长度。
代码:
y = [diff(x)>1 1]; %// step 1
y = cumsum(fliplr(y)); %// step 2
y = fliplr(histc(y, 1:y(end))); %// step 3
我想计算连续整数序列的所有长度,return 将它们作为向量计算。
例如,考虑向量:
x = [1 2 3 4 6 8 9 10 12 13];
长度为:
length([1 2 3 4]) = 4;
length([6]) = 1;
length([8 9 10]) = 3;
length([12 13]) = 2;
所以,我要生成的结果是:
y = [4 1 3 2]
我怎样才能做到这一点?
这等于x - (1:length(x))
的run lengths。因此你可以使用:
runLengths = @(x) diff([0, reshape(find(x(1:end-1)~=x(2:end)),1,[]), numel(x)]);
sequenceCounts = @(x) runLengths(x(:)-(1:numel(x)).');
result = sequenceCounts(x);
这应该可以解决问题:
y = diff(find(diff([nan ; x(:) ; nan]) ~= 1))
里面的diff
寻找的是不是+1(断序)的步骤,find
确定对应的位置(索引), outer diff
计算序列长度作为序列中断位置之间的差异。 nan
用于确保找到向量开头的序列和结尾的序列,方法是引入不同于 1 的 diff
值。
x = [1 2 3 4 6 8 9 10 12 13];
consecs = []; % empty vector to store answers
consec = 1; % initialize
for I=2:length(x)
if x(I)==x(I-1)+1 % this one is consecutive with previous
consec = consec+1;
else % this one starts a new set of consecutives
consecs(end+1) = consec;
consec = 1;
end
end
consecs(end+1)=consec; % remember to include the last consecutives
display(consecs)
这已经过测试并且有效。
- 使用
diff
检测大于 1 的差异。这会在每个 运行 的 end 处给出一个1
值。 - 向后累积(使用
cumsum
)为每个 运行 分配不同的数字标签。向后累加是因为步骤 1 中的1
值在每个 运行 的末尾,而不是在开头。 - 用
histc
计算运行长度。
代码:
y = [diff(x)>1 1]; %// step 1
y = cumsum(fliplr(y)); %// step 2
y = fliplr(histc(y, 1:y(end))); %// step 3