MatLab集团按非降序排列

时间:2018-04-05 04:37:39

标签: matlab group-by

在MatLab 2016b中,有没有办法按非降序对下面的矢量值进行分组?

values = [1 1 1 7 17 74 89 91 96 1 5 32 43 78 84 95 98 100 0 0 15 31 69 88 94 97 100 100 100 0 2 12 42 66 78 83 89 94 97 1 6 34 63 65 75 89 93 98]

所以我会得到以下小组:

组A)1 1 1 7 17 74 89 91 96

组B)1 5 32 43 78 84 95 98 100

组C)0 0 15 31 69 88 94 97 100 100 100

组D)0 2 12 42 66 78 83 89 94 97

组E)1 6 34 63 65 75 89 93 98

2 个答案:

答案 0 :(得分:0)

diff(values)

返回一个向量,其中values的每个元素与以下元素之间存在差异。我们可以在比较中使用它来给出一个逻辑向量:

diff(values) < 0
只要true的对应元素小于以下元素,

就会返回包含values或1的向量。要完成这项工作,我们可以使用cumsum函数返回一个包含输入向量中元素运行总数的向量:

groups = cumsum([1, diff(values) < 0])

只有一个皱纹:我们必须在diff向量的前面添加一个额外的元素,因为它比values少了一个元素。现在我们有一个向量groups,其中values的每个元素应该包含1,应该在第一组中,2应该在第二组中的每个元素,依此类推。

您可以使用逻辑索引访问各个组:

values(groups == n) % returns a vector of the values in group n

如果您希望将这些组作为单独的向量,则可以使用arrayfun

groupArray = arrayfun(@(x) values(groups == x), 1:max(groups), 'UniformOutput', false)

这将返回一个单元格数组,其中groupArray{1}是第一组,groupArray{2}是第二组,等等。

答案 1 :(得分:0)

以下代码可以为您提供所需内容:

% Define the values...
values = [1 1 1 7 17 74 89 91 96 1 5 32 43 78 84 95 98 100 0 0 15 31 69 88 94 97 100 100 100 0 2 12 42 66 78 83 89 94 97 1 6 34 63 65 75 89 93 98];

% Define the linear indices...
subs = 1:numel(values);

% Define the grouping indices...
idx = [0 subs(diff(values) < 0) subs(end)];

% Split the values into multiple arrays...
result = arrayfun(@(k)values(idx(k-1)+1:idx(k)),2:numel(idx),'UniformOutput',false);

这是最终输出:

>> result{:}

ans =
      1     1     1     7    17    74    89    91    96
ans =
      1     5    32    43    78    84    95    98   100
ans =
      0     0    15    31    69    88    94    97   100   100   100
ans =
      0     2    12    42    66    78    83    89    94    97
ans =
      1     6    34    63    65    75    89    93    98