2017-10-21 3 views
0

Ich bin in Matlab Codierung und da Matlab funktioniert nicht gut mit "für" Schleifen muss ich vermeiden, damit ich es so schnell wie möglich machen kann. Hier ist ein Teil meines Codes, der sich mit "für" beschäftigt.Vermeidung von For-Schleife für Matrix-Berechnungen

for i = 1:size(U,1) 
    for j=1:size(U,2)   
     v(i,j) = U(mod(i+1-1,size(U,1))+1,j) + U(i,mod(j+1-1,size(U,2))+1) ... 
       + U(mod(i-1-1,size(U,1))+1,j) + U(i,mod(j-1-1,size(U,2))+1) - 4*U(i,j); 
    end 
end 

Es ist eine periodische Randbedingung in meiner Matrix, das ist, warum ich „mod“ Funktionen verwenden. Dieser Code ähnelt tatsächlich der Funktion "del2" in Matlab, aber die Matlab-Version arbeitet nicht mit periodischen Randbedingungen.

+3

Bitte erklären Sie, was Sie meinen Matlab funktioniert nicht gut mit "für" Schleifen –

+0

@BradDay Es kann die Laufzeit einer Simulation erhöhen, wenn Sie zu viele "for" Schleifen verwenden, und wenn Sie den gleichen Code in einer anderen Sprache schreiben Programmierung wie C++ wäre es schneller. Wie auch immer, ich bin auf der Suche nach einer Alternative für Schleifen Strukturen wie "für", das ist es ... – aaa

+0

Hmm. Ich sehe keine Möglichkeit, dies ohne einen iterativen Prozess zu tun, da Sie die Nachbarn von U (i, j) für den Laplace-Operator betrachten müssen. Das einzige, was ich vorschlagen könnte, wenn Matlab den Code zu langsam ausführt, ist die Verwendung einer parallelen for-Schleife mit [parfor] (https://www.mathworks.com/help/distcomp/parfor.html) –

Antwort

0

Vectorised Version mit meshgrid:

[n,m] = meshgrid(1:size(U,2),1:size(U,1)); 
v = U(sub2ind(size(U),mod(m,size(U,1))+1,n)) + U(sub2ind(size(U),m,mod(n,size(U,2))+1)) ... 
    + U(sub2ind(size(U),mod(m-2,size(U,1))+1,n)) + U(sub2ind(size(U),m,mod(n-2,size(U,2))+1)) - 4.*U; 

Sie könnten auch die Schleife (wahrscheinlich durch mehrere Größenordnungen) beschleunigen durch preallocating memory. In diesem Fall setzen Sie einfach

vor der Schleife.

Verwandte Themen