2013-03-01 2 views
3

Прежде всего мне очень сложно описать проблему действительно хорошо, но я попробую.Группировка строк матрицы в терминах одного столбца

Говорят, что у нас есть матрице А

A = [23 1; 
    45 1 
    78 1 
    86 1 
    98 2 
    1 2 
    23 2 
    14 3 
    15 4 
    85 4] 

То, что я хочу, как выход

B{1} = [23,45,78,86] 
    B{2} = [98,1,23] 
    B{3} = [14] 
    B{4} = [15,85] 

Имейте в виду, что оригинал А огромная матрица, и я не хочу это сделать с петлями. Я хотел бы использовать функции, которые используют параллельную обработку.

ответ

6

Вы можете использовать accumarray здесь:

B = accumarray(A(:,2),A(:,1),[],@(x){x},{}); 

Если вы знаете, что A сортируется, и что нет отсутствует запись из второго столбца, вы можете также использовать mat2cell:

counts = histc(A(:,2),unique(A(:,2))); 
B = mat2cell(A(:,1),counts); 
+0

это блестящий ти. – bop

+0

привет, что делать, если вы не можете использовать параметр № 2, потому что есть одна отсутствующая запись, но вы хотите скопировать все столбцы в A, а не только в первую, так что не можете использовать накопитель? – Austin

+1

@ Jake: вы можете определенно использовать 'accumarray':' B = accumarray (A (:, 2), (1: size (A, 1)) ', [], @ (x) {A (x, :) }, {}); '. Трюк состоит в том, чтобы передать индексный вектор в накопитель. – Jonas

1

Вот простой способ сделать это. Он использует цикл, но должен быть довольно быстрым, потому что массив ячеек B предварительно выделяется с использованием обратного индекса.

for key = fliplr(unique(A(:,2)')) 
    ndx = A(:,2) == key; 
    B{key} = A(ndx,1)'; 
end 
+0

, что трюк fliplr спас меня 5 секунд. но мне нужно больше: D – bop

Смежные вопросы