Я хочу сгруппировать столбцы матрицы A, которые имеют одинаковое значение для третьей строки в Matlab - PullRequest
3 голосов
/ 01 января 2012

Для матрицы A (4 строки, 1000 столбцов). Я хочу сгруппировать столбцы матрицы A, которые имеют одинаковое значение для третьей строки. поэтому я должен иметь подматрицу с третьей строкой, которая содержит то же значение.

например:

если:

A =

     1     4     5     2     2     2     2     1     1     5
     1     4     5     4     4     2     2     4     5     2
     3     3     3     3     4     1     3     5     3     4
     4     5     5     5     4     1     5     5     5     5

тогда

A1 =

     1     4     5     2     2     1
     1     4     5     4     2     5
     3     3     3     3     3     3
     4     5     5     5     5     5

A2 =

     2     5
     4     2
     4     4
     4     5

A3 =

     2
     2
     1
     1

результат может быть в форме ячейки.

Ответы [ 3 ]

4 голосов
/ 01 января 2012

вот один из возможных способов взлома (предупреждение: я не смог это проверить):

A =

 1     4     5     2     2     2     2     1     1     5
 1     4     5     4     4     2     2     4     5     2
 3     3     3     3     4     1     3     5     3     4
 4     5     5     5     4     1     5     5     5     5

specialRow=3;
unqCols = unique(A(specialRow,:));
numUnq = length(unqCols);
sepMats{numUnq}=[];

for i=1:numUnq
    sepMats{i} = A(:,A(specialRow,:)==unqCols(i));
end
3 голосов
/ 01 января 2012

В показанном вами примере в 3-й строке есть 4 уникальных элемента, поэтому вы должны получить 4 подматрицы, но вы видите только 3?

Вот один из способов:

clear all;

%data
A = [1     4     5     2     2     2     2     1     1     5;
     1     4     5     4     4     2     2     4     5     2;
     3     3     3     3     4     1     3     5     3     4;
     4     5     5     5     4     1     5     5     5     5
     ]

%engine
row = 3;
b   = unique(A(row,:));
r   = arrayfun(@(i) A(:,A(row,:)==b(i)),1:length(b), 'UniformOutput',false);

r{:}
1 голос
/ 01 января 2012

Вы можете сделать назначение в одной строке, используя ACCUMARRAY :

A = [1     4     5     2     2     2     2     1     1     5;
     1     4     5     4     4     2     2     4     5     2;
     3     3     3     3     4     1     3     5     3     4;
     4     5     5     5     4     1     5     5     5     5
     ];

out = accumarray(A(3,:)', (1:size(A,2)), [], @(x){A(:,x)} );

При этом out{i} содержит все столбцы A, где третья строка A равно i (и пусто, если нет допустимого столбца).

Если вы хотите, чтобы out{i} содержал столбцы, соответствующие i-му наименьшему уникальному значению в третьей строке A,сначала вы можете использовать GRP2IDX из набора инструментов статистики:

[idx,correspondingEntryInA] = grp2idx(A(3,:)'); %'#
out = accumarray(idx, (1:size(A,2)), [], @(x){A(:,x)} );

Здесь out{i} содержит столбцы, соответствующие correspondingEntryInA(i).

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