2010-03-18 9 views
5

I in Matrix Welt kamen von Schleifen Welt (C, usw)schleifenlose Funktion ruft Vektor/Matrix-Elemente in Matlab/Octave

Ich mag würde, eine Funktion für jedes einzelne Mitglied einer Vektor/Matrix nennen, und gebe den resultierenden Vektor/die Matrix zurück.

Dies ist, wie ich es zur Zeit:

function retval = gauss(v, a, b, c) 
    for i = 1:length(v) 
    retval(i) = a*(e^(-(v(i)-b)*(v(i)-b)/(2*c*c))); 
    endfor 
endfunction 

Beispiel Nutzung:

octave:47> d=[1:1000]; 
octave:48> mycurve=gauss(d, 1, 500, 100); 

nun alle Ratschläge auf MATLAB/Octave sagt: STOP, wenn Sie sich Schleifen und denken Sie an eine Verwendung fangen besserer Weg.

Also, meine Frage: Kann man eine Funktion auf jedem Mitglied eines Vektors/Matrix aufrufen und das Ergebnis in einem neuen Vektor/Matrix auf einmal ohne explizite Schleifen zurückgeben?

Das heißt ich für so etwas suchen:

function retval = newfun(v) 
    retval = 42*(v^23); 
endfunction 

Vielleicht ist es nur syntaktischer Zucker, das ist alles, würde aber immer noch nützlich sein, zu wissen.

+0

Wow, danke für die schnelle Antwort Jungs! Schön, etwas Neues zu lernen :) – Sint

Antwort

6

Die Funktion sollte wie folgt aussehen:

function retval = gauss(v, a, b, c) 
    retval = a*exp(-(v-b).^2/(2*c^2)); 

Ich würde Ihnen empfehlen MATLAB Dokumentation zu lesen, wie Sie den Code vektorisieren und vermeiden Schleifen:

Code Vectorization Guide

Techniques for Improving Performance

Denken Sie auch daran, dass manchmal Code mit Schleifen klarer sein kann, dass vektorisiert, und mit der jüngsten Einführung von JIT-Compiler MATLAB befasst sich mit Schleifen ziemlich gut.

+0

Danke! Leseführer gerade jetzt. – Sint

+0

Octave profitiert jedoch immer noch stark vom Vektorisieren und nicht vom Looping. – mtrw

1

Ja.

function retval = newfun(v) 
    retval = a*exp(-((v-b).^2)/(2*c*c)); 
endfunction 
6

In Matlab die '.' Präfix für Operatoren ist elementweise Operation.

versuchen, etwas wie folgt aus:

function r = newfun(v) 
r = a.*exp(-(v-b).^2./(2*c^2)) 
end 
3

ARRAYFUN (und seine Verwandten) ist der übliche Weg, das zu tun.

Aber in Ihrem Fall, können Sie nur

mycurve = a*exp(-(d-b).^2/(2*c^2)); 

Es ist nicht nur syntaktischer Zucker; Durch das Eliminieren von Schleifen wird Ihr Code wesentlich schneller ausgeführt.

+0

+1 für die Erwähnung von Arrayfun – gaborous