Ich möchte meinen Kommentar erweitern und das Beispiel, auf das Sie verweisen, auf eine Weise überarbeiten, die verständlicher sein sollte als das Original, und erklären, warum fft
die Koeffizienten so zurückgegeben werden, wie sie es tun.
Als Referenz lautet der fft-Teil des Beispiels:
Nx = size(x,2);
k = 2*pi/(b-a)*[0:Nx/2-1 0 -Nx/2+1:-1];
dFdx = ifft(1i*k.*fft(f));
d2Fdx2 = ifft(-k.^2.*fft(f));
Ich habe einen weiteren Codeabschnitt direkt darunter hinzugefügt:
Nx = size(x,2);
k = 2*pi/(b-a)*(-Nx/2:Nx/2-1);
dFdxp = ifft(ifftshift(1i*k.*fftshift(fft(f))));
d2Fdx2p = ifft(ifftshift(-k.^2.*fftshift(fft(f))));
und wickelte beide Codeteile in ein tic; toc
für die richtige Zeit. In einem besser lesbaren Format verwendet die zweite Methode:
ckf = fftshift(fft(f));
ckdf = 1i*k.*ckf;
df = ifft(ifftshift(ckdf));
Der erste Unterschied ist, dass das zweite Beispiel viel intuitiver ist k
. Dies ist der Hauptvorteil des zweiten Beispiels, da k jetzt in der Form vorliegt, in der wir über sie nachdenken. In der zweiten und dritten Zeile musste ich fftshift
um den Anruf herum hinzufügen fft
, dann einen Anruf ifftshift
direkt innerhalb des Anrufs an ifft
. Diese zusätzlichen Funktionsaufrufe ordnen die Koeffizienten von dem, was der Computer benötigt, um mit ihnen zu arbeiten, zu der Art und Weise neu, wie Menschen normalerweise über sie denken.
Das Problem mit dem zweiten Beispiel ist, dass dies zwar k
für uns intuitiver ist, die internen Matrizen jedoch zum Lösen und Invertieren fft
in nicht so vorteilhaften Formen verbleiben. Entweder müssen wir die Reihenfolge mit Aufrufen auf fftswitch
ändern ifftswitch
oder es muss fest in die fft
Funktionen codiert werden . Dies ist weniger fehleranfällig für Benutzer (vorausgesetzt, sie sind mit der Funktionsweise von fft nicht vertraut, wie es viele Leute tun), aber Sie zahlen einen Preis in der Laufzeit.
Wie ich bereits sagte, fügte ich zum Vergleich Timing-Aufrufe um die beiden Blöcke hinzu und lief für mehrere N. Die Timing-Ergebnisse waren:
N = 1000, Ex1 = 0.000222 s, Ex2 = 0.007072 s
N = 10000, Ex1 = 0.001576 s, Ex2 = 0.003506 s
N = 100000, Ex1 = 0.023857 s, Ex2 = 0.034051 s
N = 1000000, Ex1 = 0.213816 s, Ex2 = 0.406250 s
N = 10000000, Ex1 = 4.555143 s, Ex2 = 7.102348 s
Wie Sie sehen können, verlangsamt das Hin- und Herwechseln der Werte den Prozess erheblich, insbesondere bei niedrigem N (wo es 30x langsamer ist). Dies ist nur ein Beispiel, und Ihr Computer zeigt möglicherweise leicht unterschiedliche Trends, abhängig von der Speichergeschwindigkeit, den Prozessorkernen / -geschwindigkeiten usw., aber dies veranschaulicht den Punkt. Der Grund für fft
die verwirrende Ausgabe liegt darin, dass Sie einen nicht trivialen Bruchteil Ihrer Rechenzeit sparen.