我有以下数组:A = [2 7 8 9 10]
我正在寻找一种方法来对其后续元素进行分组,以便得到像B = [1 2; 4 7]
这样的结果,其中第一列返回后续元素的数量,第二个是第一个元素的值。
您如何建议解决问题?
答案 0 :(得分:3)
试试这个:
idx = find([[0 diff(A)] ~= 1 1]);
B = [diff(idx); A(idx(1:end-1))].';
逻辑是:
您有兴趣知道后续序列何时开始。您可以使用diff函数计算每个元素与前一个元素之间的差异,如下所示:
>> A = [2 7 8 9 10]
>> diff(A)
ans =
5 1 1 1
我们希望关注不同于1的值(因为它们在序列中)。在这种情况下,5表示7,8,9,10序列的开始。此外,第一个元素始终启动序列。我们可能会强迫"这通过在响应中添加0,如下所示:
>> [0 diff(A)]
ans =
0 5 1 1 1
现在,我们需要得到不同于1的数字:
>> [0 diff(A)] ~= 1
ans =
1 1 0 0 0
由于我们想知道序列的长度,知道最后一个序列的结尾会很有趣。为此,我们最后添加1:
>> [[0 diff(A)] ~= 1 1]
ans =
1 1 0 0 0 1
现在我们使用find来获取1的索引:
>> idx = find([[0 diff(A)] ~= 1 1])
ans =
1 2 6
它告诉我们我们有两个序列:第一个从1开始,范围从1..2-1,第二个从2开始,范围从2..6-1。如果我们做一个idx的差异,我们得到长度:
>> diff(idx)
ans =
1 4
要获取值,我们使用A
(忽略最后一个值)对idx
进行索引:
>> A(idx(1:end-1))
ans =
2 7
最后一行只是将它组合成一个行矩阵,并将其转置:
>> B = [diff(idx); A(idx(1:end-1))].'
ans =
1 2
4 7