与另一列中数字的第一次和最后一次出现相对应的列中的值之和 - matlab

时间:2018-01-03 01:02:05

标签: matlab

a = [1 1 1 1 2 2 2 2 3 3 3 3; 1 2 3 4 5 6 7 8 9 10 11 12]';

第2列中与第1列中每个数字的第一个和最后一个匹配项相对应的最快方法是什么?

所需的输出:

1  5
2  13
3  21

编辑:如果第1列中的数字的排序方式不同,结果应该相同。

a = [2 2 2 2 1 1 1 1 3 3 3 3; 1 2 3 4 5 6 7 8 9 10 11 12]';

    2  5
    1  13
    3  21

1 个答案:

答案 0 :(得分:3)

您可以按如下方式使用accumarray。不确定它有多快,特别是因为它使用自定义匿名函数:

[u, ~, v] = unique(a(:,1), 'stable');
s = accumarray(v, a(:,2), [], @(x) x(1)+x(end));
result = [u s];

如果a第一列中的值始终位于连续组中,则也可以使用以下方法:

ind_diff = find(diff(a(:,1))~=0);
ind_first = [1; ind_diff+1];
ind_last = [ind_diff; size(a,1)];
s = a(ind_first,2) + a(ind_last,2);
result = [unique(a(:,1), 'stable') s];