Поиск столбцов матрицы, которые являются одинаковыми для комбинации событий


Как я могу изменить этот многопетлевой для уменьшения времени вычисления?

А это матрицы (5 × 10000), где в пятой строке содержатся значения между 1 и 50, соответствующие различным событиям эксперимент. Моя цель состоит в том, чтобы найти столбцы матрицы, которые являются одинаковыми для всех возможных комбинаций из 7 разных событий.

data = A(1:4,:);
exptEvents = A(5,:);

% Find repeats
[b,i,j] = unique(data', 'rows');

% Organize the indices of the repeated columns into a cell array
reps = arrayfun(@(x) find(j==x), 1:length(i), 'UniformOutput', false);

% Find events corresponding to these repeats
reps_Events = cellfun(@(x) exptEvents(x), reps, 'UniformOutput', false);

U = cellfun(@unique, reps_Events, 'UniformOutput', false);
repeat_counts = cellfun(@length, U);


kk=1;

for i1=1:50
    for i2=1:50 
        for i3=1:50 
            for i4=1:50
                for i5=1:50
                    for i6=1:50
                        for i7=1:50
                            if i1~=i2 && i2~=i3 && i3~=i4 && i4~=i5 && i5~=i6 && i6~=i7   
                               myEvents = [i1 i2 i3 i4 i5 i6 i7];
                               v= b(cellfun(@(x)all(ismember(myEvents,x)),U),:);
                               intersection(1,kk)=v(1);
                               intersection(2,kk)=v(2);
                               intersection(3,kk)=v(3);
                               intersection(4,kk)=v(4);
                               intersection(5,kk)=i1;
                               intersection(6,kk)=i2;
                               intersection(7,kk)=i3;
                               intersection(8,kk)=i4;
                               intersection(9,kk)=i5;
                               intersection(10,kk)=i6;
                               intersection(11,kk)=i7;
                               kk=kk+1;
                            end
                        end
                    end
                end
            end
        end
    end
end


Комментарии
1 ответ

Есть довольно много вещей, которые вы можете сделать, чтобы уменьшить время расчета.

Во-первых, если вы знаете, что результат должен быть комбинацией из семи событий, вы можете выкинуть все, что есть меньше из них.

Затем, вы можете предварительного назначения выходного массива (растет в цикле обычно не очень быстро).

Наконец, вы хотите сгенерировать все возможные подмножества, если есть, скажем, 9 мероприятий, из которых можно выбрать 7.

Ты начнешь

%# throw out useless stuff
tooFewIdx = repeat_counts < 7;

b(tooFewIdx,:) = [];
U(tooFewIdx) = [];
repeat_counts(tooFewIdx) = [];

%# estimate how many combinations you will get
nPerms = arrayfun(@(x)nchoosek(x,7),repeat_counts);

intIdx = [0;cumsum(nPerms(:))];

%# pre-assign output
%# If this runs out of memory, try using integer formats
%# instead, e.g. zeros(...,'uint8') if no value is above 255
intersection = zeros(intIdx(end),11);

%# loop to fill intersection
for i=1:length(U)

%# fill in the experiment information
intersection((intIdx(i)+1):intIdx(i+1),1:4) = repmat(b(i,:),nPerms(i),1);

%# add all combinations of events
intersection((intIdx(i)+1):intIdx(i+1),5:11) = combnk(U{i},7);

end

1
ответ дан 14 декабря 2011 в 10:12 Источник Поделиться