• Liebe User, bitte beachtet folgendes Thema: Was im Forum passiert, bleibt im Forum! Danke!
  • Hallo Gemeinde! Das Problem leidet zurzeit unter technischen Problemen. Wir sind da dran, aber das Zeitkontingent ist begrenzt. In der Zwischenzeit dürfte den meisten aufgefallen sein, dass das Erstellen von Posts funktioniert, auch wenn das Forum erstmal eine Fehlermeldung wirft. Um unseren Löschaufwand zu minimieren, bitten wir euch darum, nicht mehrmals auf 'Post Reply' zu klicken, da das zur Mehrfachposts führt. Grußworte.

Matlab/Matrizenrechnung/FFT

Mitglied seit
06.10.2001
Beiträge
598
Reaktionen
0
Hi,

stehe grade leider irgendwie aufm Schlauch!


folgendes Szenario:

I ist die Einheitsmatrix
F die DFT-Matrix: 1/wurzel(N)*exp(-2*pi*k*i/N) mit k,i = 0,...,N-1

nun sei I eine 4x4 Einheitsmatrix;
und für F sei N = 1200;

D ist das Kroneckerprodukt von I und F

Soweit alles klar? Hoffe das geht ohne Latex-Code



jetzt hab ich 4 mal ein z, z1, z2, z3, z4 (im Beispiel-Code ist es a1 bis a4)
diese z haben verschiedene Werte!
z1 bis z4 ist ein Spaltenvektor mit der Länge 1200, also N
y seien nun die hintereinandergereihten z
y ist also ein Spaltenvektor mit der Länge 4800



Jetzt wird folgendes ausgerechnet:

ŷ=D*y


Meine eigentliche Frage ist:

Kann ich diese Prozedur vereinfachen, schneller machen in Matlab?
Meine Idee ist, von den 4 z jeweils die FFT zu berechnen und aus den 4 FFT-Vektoren dann den ŷ zu erstellen, also einfach die Vektoren wieder hintereinanderreihen.



Habe mal mit Matlab einfach die Differenz der beiden Varianten gebildet (ohne Betrag, ist das richtig?). Es kommt nicht 0 raus, allerdings 10^(-14) als Vorfaktor der Werte, also nahe 0. Eventuell Nummerische Fehler von Matlab? Oder hab ich einfach nur "Glück" dass es fast 0 ist?



Hier mal ein Beispiel im Matlab-Code:

a1=rand(100,1)*20;
a2=rand(100,1)*550;
a3=rand(100,1)*5;
a4=rand(100,1)*14;


kron(sparse(eye(4)),fft(eye(100).*1/sqrt(100)))*[a1' a2' a3' a4']'
-
1/sqrt(100)*[fft(a1); fft(a2); fft(a3); fft(a4);]


Hab das mal bewusst so auseinander geschrieben (mit dem Minus). Sparse benutzt nur die Werte die nicht 0 sind, gibt schonmal sehr viel an Rechengeschwindigkeit.

Hoffe das ist so verständlich ausgedrückt, falls nicht werde ich wohl mal für alles Formeln in Latex erstellen müssen :|
 
Mitglied seit
15.09.2000
Beiträge
1.738
Reaktionen
406
Es ist mir ein wenig zu anstrengend, mich so durch deine Formeln zu quälen. Kronecker und FFT ist leider auch nicht so meine Spezialität, dass ich das auf Anhieb sehen würde, müsste es also auch ordentlich aufschreiben und nachrechnen.


Deshalb nur zu Matlab:

Matlab macht immer numerische Fehler. Die Präzision von Matlab wird angezeigt, wenn Du "eps" eingibst und liegt ca. bei 10^(-15). Bei mehreren Operationen ist es völlig normal, dass am Ende 10^(-14) herauskommt. Also ja, das ist de facto 0 und sicher kein Zufall. Insofern würde ich mal davon ausgehen, dass zumindest für dieses Beispiel Deine Umformung richtig ist.
 

voelkerballtier

Coverage, Staff, Coding
Mitglied seit
01.12.2003
Beiträge
1.603
Reaktionen
0
Ich versteh nicht ganz was die sache mit der DFT Matrix soll - wenn du von 4 vektoren die FT brauchst dann rechne von den 4 Vektoren die FT aus - vorzugsweise per FFT weil das die mit Abstand schnellste Implementation ist. Die riesige Matrixmultplikation D*y erscheint mir leicht unnütz.
Und ja Abweichungen von ~10^-14 sind sicherlich numerischer Natur
 
Mitglied seit
06.10.2001
Beiträge
598
Reaktionen
0
Danke erstmal für die Antworten.

Ich werde im Laufe des Tages noch einmal alles ordentlich aufschreiben, vielleicht erst heute abend.


Das Problem ist, ich beziehe mich auf eine externe Quelle. In dieser Quelle wird es mit dem Kronecker Produkt / DFT Matrix beschrieben. Dort ist natürlich keine Matlab-Implementation mit angegeben ;)

Es handelt sich um MIMO Signalverarbeitung, deswegen 4 mal 1200 "Blöcke".

Ich bin mir halt nicht sicher ob meine Berechnung das selbe macht, werde aber wie gesagt das ganze nochmal ordentlicher formulieren später!
 

voelkerballtier

Coverage, Staff, Coding
Mitglied seit
01.12.2003
Beiträge
1.603
Reaktionen
0
ach so sorry ich hatte dein urspruengliches problem nicht verstanden.
Also fuer mich sieht es schon sehr danach aus als wuerde die Formulierung mit der DFT Matrix einfach nur die FT ausrechnen - nur eben aeusserst umstaendlich. Da dein numerischer Vergleich nun auch noch im Rahmen der Maschinengenauigkeit bleibt habe ich eigentlich keine Zweifel.
Die Maschinengenauigkeit kann man grob abschaetzen: Matlab nutzt double precision, d.h. bei jeder (simplen, +-*/ ) Operation betraegt der Fehler ~10^-16. Das Matrix-Vektor Produkt y' = D*y entspricht N Operationen fuer jeden Eintrag in y', numerische Fehler addieren sich, also erwartet man ~N*10^-16 ~ 10^-14 als numerischen Fehler dieser Operation. D.h. erst wenn du Abweichungen >~ 10^-13 bekommst (fuer N=100) solltest du dir Gedanken machen.
 
Oben