MATLAB中连续整数序列的计数长度
我想计算连续整数序列的所有长度,并将它们作为向量返回。 例如,考虑向量:MATLAB中连续整数序列的计数长度,matlab,run-length-encoding,Matlab,Run Length Encoding,我想计算连续整数序列的所有长度,并将它们作为向量返回。 例如,考虑向量: x=[1234689101213] 长度为: 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))。因此,您可以使用: runLengths = @(x) diff([0, reshape(fi
x=[1234689101213]代码>
长度为:
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))
。因此,您可以使用:
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);
这等于x-(1:length(x))
的长度。因此,您可以使用:
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
确定相应的位置(索引),外部diff
计算序列长度作为序列中断位置之间的差异。通过引入不同于1的diff
值,存在nan
s以确保找到向量开始处的序列和结束处的序列。这应该起到以下作用:
y = diff(find(diff([nan ; x(:) ; nan]) ~= 1))
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(序列中断)的步骤,find
确定相应的位置(索引),外部diff
计算序列长度作为序列中断位置之间的差异。存在nan
s,通过引入不同于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)
这是测试,它的工作
这是测试,它的工作 以下各项的微小变化:
用于检测大于1的差异。这将在每次运行结束时给出一个1
值
向后累积(使用)为每次运行指定不同的数字标签。由于步骤1中的1
值位于每次运行的末尾,而不是开始,因此累加是向后进行的
使用计算运行长度
代码:
一个小的变化:
用于检测大于1的差异。这将在每次运行结束时给出一个1
值
向后累积(使用)为每次运行指定不同的数字标签。由于步骤1中的1
值位于每次运行的末尾,而不是开始,因此累加是向后进行的
使用计算运行长度
代码:
在这里看一看:它不是完全重复的,但它涵盖了您的问题和更多内容:您正在寻找所谓的x-(1:length(x))
的运行长度。因此,您可以使用以下答案:@knedlsepp,在RLE中运行通常被认为是具有相同值的序列。这两件事当然很接近,但并不完全相同。@A.Donda:但是x-(1:length(x))
的运行长度不仅很接近,而且正是我们想要的……看看这里:它不是完全重复的,但它涵盖了您的问题和更多:您正在寻找所谓的x-(1:length(x))
的运行长度。因此,您可以使用以下答案:@knedlsepp,在RLE中运行通常被认为是具有相同值的序列。这两件事当然很接近,但并不完全相同。更准确地说。@A.Donda:但是x-(1:length(x))
的运行长度不仅很接近,而且正是我们想要的…y=diff(find([0 diff(x)0]~=1))
来避免NaNs
?@Divakar,嗯,当然,但我想避免在这些数字中不存在0(或-2,-1,…)的假设。“南”并不是真正的问题,是吗?或者,你可以先做内部的差异,然后前置并附加1,就像Knedlseps的答案一样。然而,我发现这不必要地复杂…它适用于小x向量,但我有一个542474×1列向量,我得到了以下错误:“使用串联矩阵的horzcat维数的错误不一致”。@Divakar,即使数据中存在nan:nan-nan
也是nan
,因此与+1不同。数据中的每个NaN,在开始、结束或中间的某个地方,作为输出中的长度为1的序列出现。除非这不是预期的行为,否则我认为没有问题。y=diff(find([0 diff(x)0]~=1))
为了避免NaNs
?@Divakar,嗯,当然,但我想避免假设数字中不可能有0(或-2,-1,…)。“南”并不是真正的问题,是吗?或者,你可以先做内部的差异,然后前置并附加1,就像Knedlseps的答案一样。然而,我发现这不必要地复杂…它适用于小x向量,但我有一个542474×1列向量,我得到了以下错误:“使用串联矩阵的horzcat维数的错误不一致”。@Divakar,即使数据中存在nan:nan-nan
也是nan
,因此与+1不同。数据中的每个NaN,在开始、结束或中间的某个地方,作为输出中的长度为1的序列出现。除非这不是预期的行为,否则我认为没有问题。但是为什么有必要向后累积?@A.Donda因为步骤1在每次运行结束时都会产生一个。我将编辑以澄清为什么需要向后累积?@A.Donda,因为步骤1在每次运行结束时都会生成一个。我将编辑以澄清