在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
答案 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