Creating all possible combination of rows in matlab

独自空忆成欢 提交于 2021-01-28 05:34:46

问题


I have a matrix which is 9x10000 size.

So rows are R1, R2, upto R9.

I want to generate all possible combination of the rows such as [R1;R2] [R1;R3].. [R1;R9] [R1;R2;R3]...[R1;R2;R4]... [R1;R2:R3;R4;..R8]

I am currently doing this using for loops.

Is there any better way of doing this.


回答1:


Basically, counting up the binary from 1 to 2^9-i indicates which rows need to be selected:

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



回答2:


As in the comment, I'm not sure if you always want the first row. This code doesn't do that, but you can modify it for that easily enough. It still uses for loops, but relies on the "nchoosek" function for the row index generation.

%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



回答3:


The function nchoosek, when given a vector, will return all possible ways to choose k values from that vector. You can trick it into giving you what you want with

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

This will include all possible ways to select 9 values from the set that includes nine zeros, plus the indices of each of the rows. Now you have every possible combination (including "no row at all"). With this matrix generated just once, you can find any combination easily - without having to store them all in memory. You can now pick you combination:

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


来源:https://stackoverflow.com/questions/23063910/creating-all-possible-combination-of-rows-in-matlab

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!