Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中连续整数序列的计数长度_Matlab_Run Length Encoding - Fatal编程技术网

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在每次运行结束时都会生成一个。我将编辑以澄清