Группировать значения в разных строках по их индексу в первом столбце

Этот вопрос является результатом MatLab (или любой другой язык), чтобы преобразовать матрицу или csv, чтобы поместить значения 2-го столбца в ту же строку, если значение 1-го столбца такое же?

If

      A = [2 3 234 ; 2 44 33; 2 12 22; 3 123 99; 3 1232 45; 5 224 57]

1-я колонка | 2-я колонка | 3-й столбец

2             3          234
2             44         33
2             12         22
3             123        99
3             1232       45
5             224        57

затем работает

    [U ix iu] = unique(A(:,1) ); 
    r= accumarray( iu, A(:,2:3), [], @(x) {x'} )

покажет мне ошибку

    Error using accumarray
    Second input VAL must be a vector with one element for each row in SUBS, or a
    scalar.

я хочу сделать

1-й столбец | 2-й столбец | 3-й столбец | 4-й столбец | 5-й столбец | 6-й столбец| 7-й столбец

2         3        234       44        33        12        22
3         123      99        1232      45
5         224      57

Я знаю, как это сделать с помощью for и if, но это тратит слишком много времени на большие данные.

Как я могу это сделать?

Заранее спасибо!


person user1849133    schedule 03.07.2013    source источник


Ответы (1)


Вы неправильно используете accumarray в решении вашего предыдущего вопроса. Первый параметр iu — это вектор индексов, а второй параметр должен быть вектором значений той же длины. Здесь вы указали матрицу в качестве второго параметра, который фактически имеет в два раза больше значений, чем индексы в iu.

Что вам нужно сделать, чтобы заставить его работать, так это создать вектор индексов как для второго столбца, так и для третьего столбца (они являются одними и теми же индексами, не случайно!) и указать соответствующий вектор-столбец значений, например так:

[U, ix, iu] = unique(A(:,1));
vals = reshape(A(:, 2:end).', [], 1);                    %'// Columnize values
subs = reshape(iu(:, ones(size(A, 2) - 1, 1)).', [], 1); %'// Replicate indices
r = accumarray(subs, vals, [], @(x){x'});

Это решение обобщается для любого количества столбцов, которые вы хотите передать в accumarray.

person Eitan T    schedule 03.07.2013
comment
Ваше решение отличное! Большое тебе спасибо! - person user1849133; 04.07.2013
comment
@Eitan_T Да, я проголосовал за ваш ответ. Я не нажимал кнопку «вверх» после того, как получил сообщение, что вы не можете проголосовать, если ваша репутация не достигнет 15, но теперь я могу проголосовать, так как моя репутация была больше 15. Спасибо, что напомнили мне :) - person user1849133; 04.07.2013
comment
@Eitan_T Я заметил разницу между тем, что я хочу, и вашим кодом. Я пытался, но не смог получить выходную таблицу, которую написал. Ваш код, кажется, дает мне перестановку по столбцам. Но моей целью была построчная перестановка. Я пробовал некоторые изменения, но они не увенчались успехом. Возможно, мне нужно больше изучать accumarray. Не могли бы вы дать мне простое решение для этого? - person user1849133; 04.07.2013
comment
@Eitan_T Я получаю r{1}=3 44 12 22 33 234, r{2}=1232 123 99 45, r{3}= 57 224, поэтому порядок другой. - person user1849133; 07.07.2013
comment
@Eitan_T Довольно странно :( Возможно, разные версии Matlab делают разные вещи? Трудно найти причину. Чтобы найти проблему, я сообщу вам обо всех переменных, которые я получаю. - person user1849133; 07.07.2013
comment
@Eitan_T U= 2 3 5 (в векторе-столбце), ix=3 5 6 (в векторе-столбце), iu= 1 1 1 2 2 3 (в векторе-столбце), vals = 3 44 12 123 1232 224 234 33 22 99 45 57, суб = 1 1 1 2 2 3 1 1 1 2 2 3 - person user1849133; 07.07.2013
comment
@ user1849133 О, я понимаю, что вы имеете в виду. Я изменил свой ответ. - person Eitan T; 07.07.2013
comment
@Eitan_T Прошу прощения за поздний ответ. Ваше решение работает! Спасибо! - person user1849133; 15.07.2013
comment
@ user1849133 Отлично! - person Eitan T; 15.07.2013
comment
@Eitan_T Я опубликовал ответ на этот вопрос по адресу stackoverflow.com/questions/17667224/ Не могли бы вы понять, как это сделать? Конечно, я, скорее всего, обращу больше внимания на ваш ответ, чем на ответы других :) - person user1849133; 16.07.2013