2014-04-14 2 views
1

У меня есть матрица размером 9x10000.Создание всей возможной комбинации строк в matlab

Таким образом, строки R1, R2, до R9.

Я хочу, чтобы генерировать все возможные комбинации строк, таких как [R1, R2] [R1, R3] .. [R1, R9] [R1, R2, R3] ... [R1, R2; R4] ... [R1; R2: R3; R4; .. R8]

В настоящее время я использую это для циклов.

Есть ли лучший способ сделать это.

+0

Вы всегда хотите строку 1? Ваш пример подсказывает это. –

+1

Вы хотите иметь все возможные комбинации в памяти? Это много избыточного хранилища (так как у вас есть 512 возможных комбинаций с размером от 10 000 до 90 000 элементов в нем). Вероятно, лучше иметь возможность генерировать n-ю комбинацию по требованию? – Floris

+0

Посмотрите здесь: http://stackoverflow.com/questions/21895335/generate-a-matrix-containing-all-combinations-of-elements-taken-from-n-vectors –

ответ

1

В основном, подсчитывая бинарного от 1 до 2^9-я указывает, какие должны быть выбраны строки:

M=... your matrix 
S=dec2bin(1:2^size(M,1)-1)=='1'; 
allSubsets=cell(size(S,1),1); 
for ix=1:size(S,1) 
    allSubsets{ix}=M(find(S(ix,:)),:); 
end 
+0

Большое спасибо. Это довольно опрятный трюк. –

1

Как и в комментарии, я не уверен, если вы хотите всегда первый ряд , Этот код этого не делает, но вы можете легко его модифицировать. Он по-прежнему используется для циклов, но полагается на функцию «nchoosek» для генерации индекса строки.

%generate data matrix 
nMax=9; %number of rows 
M=rand(nMax,1e4); %the data 

%cell array of matrices with row combinations 
select=cell(2^nMax-nMax-1,1); %ignore singletons, empty set 

%for loop to generate the row selections 
idx=0; 
for i=2:nMax 
    %I is the matrix of row selections 
    I=nchoosek(1:nMax,i); 

    %step through the row selections and form the new matrices 
    for j=1:size(I,1) 
     idx=idx+1; %idx tracks number of entries 
     select{idx}=M(I(j,:),:); %select{idx} is the new matrix with selected rows 
     %per Floris' comment above you could do 
     %select{idx}=I(j,:); %save the selection for later 
    end 
end 
1

Функция nchoosek, когда задан вектор, возвращает все возможные способы выбора k значения из этого вектора. Вы можете обмануть его в давая вам, что вы хотите с

allCombis = unique(nchoosek([zeros(1,9) 1:9], 9), 'rows'); 

это будет включать в себя все возможные способы выбора 9 значений из набора, который включает девять нулей, плюс индексы каждой из строк. Теперь у вас есть все возможные комбинации (в том числе «никакой строки вообще»). С помощью этой матрицы, созданной только один раз, вы можете легко найти любую комбинацию - без необходимости хранить их в памяти. Теперь вы можете выбрать комбинацию:

thisNumber = 49; % pick any combination 
rows = allCombis(thisNumber, :); 
rows(rows==0)=[]; % get rid of the zeros 
thisCombination = myMatrix(rows, :); % pick just the rows corresponding to this combination 
Смежные вопросы