как я могу накапливать массив ячеек? - PullRequest
5 голосов
/ 27 апреля 2011

Скажи, что у меня есть:

A = {'a.java' 1;'a.java' 2; 'b.java' 1; 'b.java' 0; 'a.java' 4; 'c.java' 6};

Я хотел бы накапливать номера второго столбца на основе сходства первого столбца.

Я хочу получить:

B = {'a.java' 1+2+4; 'b.java' 1+0; 'c.java' 6}

Как мне этого добиться?

Большое спасибо,

Ответы [ 3 ]

6 голосов
/ 27 апреля 2011

Вы можете легко сделать это без цикла for, используя функции UNIQUE и ACCUMARRAY :

>> [uniqueValues,~,index] = unique(A(:,1));
>> B = [uniqueValues num2cell(accumarray(index,[A{:,2}]))]

B = 

    'a.java'    [7]
    'b.java'    [1]
    'c.java'    [6]
3 голосов
/ 27 апреля 2011

Примерно так:

[a b c] = unique({A{:,1}});
for i=1:length(a)
    B{i, 1} = a(i);
    B{i, 2} = sum([A{find(c==i), 2}]);
end
3 голосов
/ 27 апреля 2011

Найдите уникальные ключи в A (функция unique может обычным образом вернуть отображение из ключей в A на запись в наборе уникальных ключей), затем выполните итерации по ним.

[u,i1,i2]=unique(A(:,1));     % i1 is not needed, actually
Avalues = cell2mat(A(:,2));   % convert numerical part of cell array to matrix
for i=1:max(i2)
    u{i,2}=sum(Avalues(i2==i));
end

Это также можно расширить для работы по столбцам для нескольких столбцов данных в массиве ячеек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...