2017-01-18 6 views
0

У меня есть матрица размером n-by-3. Для некоторых строк этой матрицы первые два столбца идентичны. Мне нужно сохранить только одну копию этих комбинаций из первого-двух элементов, где в третьем столбце будет сумма из 3-х столбцов из столбцов с одинаковыми первыми двумя столбцами.Как суммировать совокупные строки матрицы следующим образом?

Вот пример того, что я хочу сделать:

M = [... 
1 2 1 
1 2 3 
1 2 2 
1 2 4 
2 3 1 
2 3 4 
2 3 0]; 

Конечная матрица, мне нужно

R = [... 
1 2 1+3+2+4 
2 3 1+4+0]; 

Как это можно сделать? Я не вижу, как я могу использовать команду unique для этого.

+0

Какую версию MATLAB вы используете? Почему вы не можете использовать 'unique'? –

+0

Я использую MATLAB 2016a. Потому что он работает только для тех матриц, что все строки дублируются. а не только некоторые части строк. Как вы думаете, я могу использовать? – rosa

ответ

3

Вы можете использовать unique в сочетании с accumarray. Давайте назовем начальным п х 3 массива A:

[C, ~, ic] = unique(A(:,1:2), 'rows'); 
B = [C, accumarray(ic, A(:,3))]; 

Объяснения:

unique выводит не только уникальные элементы массива (строки в нашем случае благодаря аргументу rows), но и два массива индексов. Первый - это индексы первых уникальных элементов в A; Я отбрасываю его, так как не использую его. Второй может быть использован для восстановления исходного массива из выходного массива: A(:, 1:2) = C(ic,:).

accumarray является обобщением вычисления гистограммы, он суммирует элементы в массиве 2-го аргумента для каждого уникального индекса в первом массиве аргументов. В вашем случае вы делаете сумму только по третьему столбцу исходного массива.

И все это в двух простых командах!