Ich sage eigentlich "Gültige Indizes sind innerhalb von PARFOR-Schleifen beschränkt". Der Grund, warum es sagt, dass MATLAB durch eine parfor
Schleife non-konsekutiv iteriert, was bedeutet, dass es Iterationen in halb-zufälliger Reihenfolge wie 5 2 4 1 3
, im Gegensatz zu 1 2 3 4 5
durchführen kann. Das heißt, um zu wissen, wo in MATLAB Ihr Ergebnis speichern muss, möchte es vor dem Eintritt in die parallele Umgebung wissen, dass keine Zeilen durch verschiedene Iterationen aufgerufen werden, um Konflikte zu vermeiden, wenn Ergebnisse von den Arbeitern erhalten werden.
Die Lösung wird darin bestehen, so zu strukturieren, dass es vorher bekannt ist, wo die Indizes Speicher sind, z. durch einen 2D-Array zu schaffen, bevor die Schleife zu verwenden Sachen zu speichern in:
xCount = 10;
yCount = 20;
area = xCount*yCount;
PP(xCount,yCount) = 0;
y=1:yCount;
parfor x = 1:xCount
z = x^2+y.*10; % my stuff to get Z.
PP(x,:) = z; % write to PP line
end
%// Go to the [x y z] format
PP = [repmat((1:yCount).',xCount,1),repmat((1:xCount).',yCount,1), PP(:)];
Ich würde persönlich nicht die letzte Zeile in diesem Fall tun, da es drei Doppelzimmer für jeden Nutzungswert (z
) speichert, während in die 2D-Matrix, die aus der Schleife kommt, speichert nur 1 double, die indiziert werden kann, indem einfach PP(x,y)
gelesen wird. Somit kostet es 3 mal den Speicher, um die gleiche Menge an nützlichen Daten zu speichern.
Anstatt ein Array von Indizes zu generieren, würde ich sagen, dass ich einfach "i = 1: area" par-loop mache und dann die entsprechenden x, y-Werte mit 'ind2sub ([xCount, yCount], i)' finde. Auf diese Weise wäre die Zuordnung zu 'PP (i)' von Matlab sauber spleißbar. –
Danke! Aber ich stimme dem Matlab-Team wirklich nicht zu. In C# kann ich das machen. Matlab Jungs haben etwas zusätzlichen Schutz Layer hinzugefügt, die ich denke, ist nur Mist! Meine ID-Berechnung war korrekt und alle IDs wären eindeutig. Wirklich, das stinkt! – Pedro77
@ Pedro77 Ich bin nicht stark auf der inneren Maschine von MATLAB, aber ich denke, etwas in der Unterseite schief geht, wenn es zwei Arbeiter gibt, die versuchen, auf das gleiche Element gleichzeitig zuzugreifen, deshalb will es * vorher * wissen, dass alle Indizes einzigartig sind . Warum funktioniert es nicht wie C#, einfach, MATLAB ~ = C#. – Adriaan