组数组元素

时间:2015-05-25 14:23:37

标签: arrays matlab sorting

我有以下数组:A = [2 7 8 9 10]我正在寻找一种方法来对其后续元素进行分组,以便得到像B = [1 2; 4 7]这样的结果,其中第一列返回后续元素的数量,第二个是第一个元素的值。

您如何建议解决问题?

1 个答案:

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