Suchen von Spalten einer Matrix, die für Kombinationen von Ereignissen gleich sind

  • Wie kann ich diese Multi-Loop ändern, um die Rechenzeit zu reduzieren?

    A ist eine Matrix (5 × 10000), bei der die fünfte ist Die Zeile enthält Werte zwischen 1 und 50, die verschiedenen Ereignissen eines Experiments entsprechen. Mein Ziel ist es, die Spalten der Matrix zu finden, die für alle möglichen Kombinationen von 7 verschiedenen Ereignissen gleich sind.

    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

    06 May 2016
    200_successAsik
1 answer
  • Es gibt einige Dinge, die Sie tun können, um die Rechenzeit zu reduzieren.

    Wenn Sie wissen, dass ein Ergebnis die Kombination von sieben sein muss Bei Ereignissen können Sie das ausgeben, was weniger hat.

    Dann können Sie das Ausgabearray vorbelegen (das Wachsen in einer Schleife ist normalerweise nicht sehr schnell).

    Zum Schluss möchten Sie alle möglichen Subsets generieren, wenn Sie beispielsweise 9 Ereignisse auswählen, aus denen Sie 7 auswählen können.

    Sie beginnen also

     %# 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
     
    15 December 2011
    noetic