【问题标题】:How to extract vectors of consecutive numbers?如何提取连续数字的向量?
【发布时间】:2016-02-08 08:49:22
【问题描述】:

假设我有一个定义为Q = [1 2 3 4 5 8 9 10 15]; 的 Q 向量,我想找到一种方法来提取连续数字的不同向量以及其余元素的向量。所以我的结果是:

q1 = [1 2 3 4 5];
q2 = [8 9 10 ];
q3 = [15];

【问题讨论】:

  • diff 函数可能是你的朋友。
  • 我尝试了 diff 功能,但结果不是我要找的。 diff 函数将在一个唯一向量中给出所有连续的数字。
  • 显示你的代码你尝试了什么
  • 你的向量Q总是单调递增的吗?数字可以重复吗?为什么Q 是元胞数组而不是法向量?
  • 它总是单调递增。并且不包括负整数。没有重蹈覆辙的机会。假设Q是一个法线向量

标签: matlab


【解决方案1】:

您可以使用diffcumsumaccumarray: 来做到这一点

q = accumarray(cumsum([1, diff(Q)~=1])', Q', [], @(x){x})

返回:

{[1,2,3,4,5];
 [8,9,10];
 [15]}

q{1} 为您提供 [1,2,3,4,5] 等,这是一个更清洁的解决方案,可以单独命名向量。但是,如果您真的很想拥有它们,并且您确切地知道要退出多少组,则可以按以下方式进行:

[q1,q2,q3] = q{:};

解释:

accumarray 将根据另一个向量(第一个输入)中指定的分组,将聚合函数(第四个输入)应用于向量(第二个输入)的元素。

要使用文档中的符号:

sub = cumsum([1, diff(Q)~=1])';
val = Q';
fun = @(x){x};

注意sub需要从1开始。这个想法是使用diff 来查找使用diff 函数矢量化的连续元素(即Q(i+1) - Q(i) == 1 的位置)。通过指定diff(Q)~=1,我们可以找到连续数字组之间的中断(在开头连接1以强制在开始处中断)。 cumsum 然后将这些中断转换为sub 的正确形式的向量,即

sub = [1 1 1 1 1 2 2 2 3]

我们指定的聚合函数只是单元格连接。

【讨论】:

  • 我得到了这个:使用 accumarray 时出错第二个输入 VAL 必须是一个向量,SUBS 中的每一行都有一个元素,或者是一个标量。
  • @MsenRezaee 抱歉离开了转置。查看编辑(即添加到's)
  • 这段代码只是让它变得更复杂。结果集中在一个更大的向量中,而不是在分离的向量中。这是我得到的结果:ans = [ 1] [ 2] [ 3] [ 4] [ 5] [] [] [ 8] [ 9] [10] [] [] [] [] [15]跨度>
  • @MsenRezaee 为什么需要单独的向量?这肯定会使您的代码更加复杂。这样,您可以通过调用q{1} 而不是q1 来获取任何向量。你想要这样,你不想要单独命名的向量。使用它们将非常麻烦。但是,如果您真的想将其拆分(您不这样做),请致电q{:}
  • 我在另一个更大的代码中间,在这部分代码中我需要分离向量。顺便谢谢
猜你喜欢
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多