2013-03-22 8 views
7

Weiß jemand, was in diesem einfachen Code mit Parfor in Matlab los ist? Danke,Matlab Parfor Schleife Indizierung

I geschnitten, um eine Matrix in vier Reihen und wollen Elemente in jedem Array aktualisieren unabhängig

Hier ist eine einfache Version:

a = zeros(4,4); 
parfor i = 1:4 
    j = 2;  
    a(j,i) = 3; 
end 

Fehler: Gültige Indizes für 'a' beschränkt sind in Parfor Schleifen;

jedoch

dies funktioniert:

a = zeros(4,4); 
parfor i = 1:4 
    a(2,i) = 3; 
end 

eine andere einfachere arbeitsfreie Version mit dem gleichen Fehler:

a = zeros(4,4); 
parfor i = 1:4 
    a(i,i) = 3; 
end 

in meiner Anwendung, Index j für jedes Array durch einige unabhängig erzeugt wird, Algorithmus

+1

Scheint wie Sie andere Indexvariablen innerhalb der Schleife nicht festlegen können. Siehe: http://www.mathworks.com/matlabcentral/newsreader/view_thread/162203 – cyang

+0

Welche Version von Matlab verwenden Sie? – alrikai

+0

Obwohl ich es nicht in meiner Version von MATLAB habe, denke ich, es ist wert, einen Blick auf 'parpool' zu werfen - http://www.mathworks.it/it/help/distcomp/parpool.html –

Antwort

1

Was Sie versuchen zu erreichen scheint nicht möglich sein.

Nach der Matlab Dokumentation:

When you use other variables along with the loop variable to index an array, you cannot set these variables inside the loop. In effect, such variables are constant over the execution of the entire parfor statement. You cannot combine the loop variable with itself to form an index expression.

MATLAB Documentation Source

So alle Variablen Sie Ihr Array, andere als die Schleifenvariable verwenden, um Index für die gesamte Schleife konstant.

+0

Ich sehe. Ich sah, dass es möglich ist, eine for-Schleife innerhalb eines Parforts zu verschachteln, um ein 2D-Array zu indizieren. Die "for" -Schleifenvariable, zB: für j = 1: 4 {a (i, j) = ..} kann sich innerhalb der parfor-Schleife ändern: für i = 1: 4 {}. Es scheint mir, solange j für alle Parforationen gleich ist, ist es sicher. Tatsächlich habe ich das in dem Dokument gefunden, auf das Sie verweisen: "Fixed Index Listing - Innerhalb der Klammern oder geschweiften Klammern der ersten Ebene ist die Liste der Indizes für alle Vorkommen einer gegebenen Variablen (aufgeschnittene Variable) gleich". –

2

Nur meine zwei Cent: Wie @mmumbos bereits erklärt, was Sie versuchen zu erreichen ist auf diese Weise nicht möglich, aber bestimmte Problemumgehungen können immer noch gelten.

Nehmen wir an, Sie so etwas wie die folgenden implementieren müssen (was die Permutation einer linearen Transformation der Matrix ist A):

n=10; 
A=rand(n,n); 
B=zeros(n,n); 
parfor i=1:n, 
    j=(i<=5)*(2*(i-1)+1)+(i>5)*(2*(i-5)); 
    B(j,i) = my_function(A(i,:)); 
end 

Versuchen Sie stattdessen die folgenden:

parfor i=1:n, 
    B_temp(i,:) = my_function(A(i,:)); 
end 

Dann Sie muss nicht wirklich eine Matrix aufbauen B; Sie können es B_temp eine ‚‘ Indextabelle ‚‘ mit Verwendung von zugreifen, die einfach ist wie folgt aufgebaut:

J=zeros(n,1); 
parfor i=1:n, 
    J(i) = (i<=5)*(2*(i-1)+1)+(i>5)*(2*(i-5)); 
end 

Dann B(i) über B_temp(J(i)) zugegriffen wird.

Neubetrachtung Ihre letzte (Zähler) Beispiel wollen wir sehen, wie Sie es um arbeiten:

n=4; 
diag_A = zeros(n,1); 
parfor i=1:n, 
    diag_A(i)=3; % or any function of i 
end 

Dann, wenn Sie die ‚zugreifen müssen‘ i ‚‘ - te Diagonalelement von A, erhalten Sie Zugang stattdessen diag_A(i).Für solche Fälle ist es zweckmäßig, eine Funktion entlang der folgenden Zeilen zu erstellen:

function a = access_matrix(A, diag_A, i, j) 
    if (i!=j), 
    a = A(i,j); 
    else 
    a = diag_A(i); 
    end 
end 

Bis MATLAB die Implementierung von parfor, solche Umgehungen verbessert wird (leider) in vielen Fällen notwendig sein.

+0

Ihr zweiter Codeabschnitt, der zum Konstruieren von 'B_temp' verwendet wird, verursacht einen Fehler in Matlab (R2016a). –

+0

@ErikM Vielen Dank - Sie haben tatsächlich einen Tippfehler gefunden. Die linke Seite sollte 'B_temp (i, :)' anstelle von 'B_temp (i, i)' sein –

0

Da es noch nicht erwähnt wurde, hier ist ein Link, der wirklich hilfreich bei der Diagnose dieser Art von Problemen ist: Classification of Variables in Parfor. Diese Probleme treten auf, wenn MATLAB die Variablen nicht in die starren Definitionen auf dieser Seite einordnen kann.

Was hier passiert ist, dass es nicht weiß, wie man die "Slice-Variable" A vor der Schleife aufteilt. Denken Sie daran, die parallele Implementierung selbst zu programmieren. Was Sie tun möchten, ist Zerschneiden A in Stücke, die Sie wissen, dass andere Prozessoren nicht berühren, und geben Sie dann an verschiedene CPUs, um unabhängig zu handeln. MATLAB betrachtet Ihre Schleife und weiß nicht, wie das geht, weil sie nicht weiß, was j ist, bis sie das Programm ausführt. Es ist eine Einschränkung von MATLAB. Ein weiterer Fall, in dem dasselbe passiert, wenn Sie komplexe Koeffizienten wie A (i * j, :) verwenden. Wiederum weiß es nicht, wie man es aufteilt.