2012-04-13 17 views
1

Derzeit habe ich eine Parfor-Schleife Berechnungen auf einer Struktur in MATLAB. Während mein Code ein bisschen zu lang zu schreiben, kann es mit dem folgende Beispiel emuliert werden:Speichern von Struct Variable in Parfor Schleifen berechnet - MATLAB

a.test = [1 2 3]; 
result = []; 

parfor i = 1:3 
    c = a; 
    c.test(2) = round(rand()); 

    if c.test(2) == 1 
    %# Store c in result 
    end 
end 

disp(result.test) %# Should show [1 1 3] 

a (und folglich c) ist eine sehr große Struktur, so dass jede Iteration zu speichern, ist für mich nicht möglich (wegen Speicherbeschränkungen).

Idealerweise möchte ich c direkt in eine Variable speichern können, die ich vor der Parfor-Schleife initialisiere. Wenn ich MATLABs Example: Using a Custom Reduction Function betrachte, kann ich sehen, dass es möglich ist, eine gegebene Iterationsvariable zu speichern (ohne jede einzelne Iteration speichern zu müssen), aber ich verstehe ihre Methode nicht vollständig. Ich bin verblüfft darüber, wie ihre Funktion (anscheinend) zwei separate Ausgangsvariablen erzeugt, während die Funktion nur eine Ausgangsvariable definiert.

Ich bin mir sicher, dass dies ein sehr häufiges Problem ist, aber bis jetzt hat keine meiner Suchen irgendwelche gültigen Ergebnisse ergeben.

Jede Hilfe würde sehr geschätzt werden.

+0

Ich bin ein wenig verwirrt von dem, was Sie meinen hier: Sie wollen parallel Iterationen tun und nehmen nur das erste Ergebnis, dass einige Test bestanden wird (vermutlich die anderen Aufgaben Cancelling)? Wenn Sie über die 'cummax'-Funktion in ihrem Array sprechen, wird nur ein Ausgang (der zufällig ein 2-Element-Array ist) ausgeführt. – Dougal

+0

Bezüglich der 'cummax' Funktion sehe ich es jetzt. Zuerst ignorierte ich die A (1) und B (1) als Formalitäten, aber ich sehe, was es gerade macht. Du schreibst, obwohl es nicht auf mich zutrifft. Das Abbrechen der anderen Aufgaben ist nicht wichtig, das Ergebnis ist wichtiger. Jonas unten zeigt eine einfache Möglichkeit, dies zu tun. – rbhalla

Antwort

2

Das Beispiel, das Sie verknüpfen, ist nicht ganz das, was Sie wollen. Es ist jedoch möglich, nur die "guten" Ergebnisse zu speichern. Hier ist ein einfaches Beispiel:

A=zeros(0,2); %# initialize A with no rows, two columns 
parfor i=1:6 
    tmp = rand(1); %# create some result 
    if tmp > 0.5 %# store only part of the results 
     A = [A;[tmp,i]]; %# store also the iteration number, in case it matters 
    end 
end 
>> A 

A = 

    0.6497 2.0000 
    0.5052 4.0000 
    0.9993 5.0000 
+0

Vielen Dank! Es ist mir peinlich zu denken, dass ich das nicht selbst herausgefunden habe. Nach dem, was ich gelesen hatte, nahm ich an, dass Sie ein bestimmtes Iterationsergebnis in diesem Iterations-Slot in einem Array speichern sollten. Die Verknüpfung der Ergebnisse in dieser Form ist mir nie in den Sinn gekommen. Danke nochmal! – rbhalla

+1

@rbOthree Beachten Sie, dass es sich hierbei tatsächlich um eine "Reduktionsmethode" handelt, wie die, mit der Sie eine Verknüpfung hergestellt haben, nur eine integrierte anstelle einer benutzerdefinierten Methode. (Hinter den Kulissen wird Matlab die Ergebnisse sammeln und sie auf irgendeine willkürliche Weise verketten, nicht notwendigerweise in der Iterationsreihenfolge oder in der Reihenfolge, in der sie beendet wurden.) – Dougal

Verwandte Themen