| |
|
|
p.specht
| Bei manchen Aufgabenstellungen, die mittels Matrizenrechnung gelöst werden sollen, ist das Produkt R = X' X einer Matrix gefragt. Mit X' wird bekanntlich die Transponierte (= die um die Hauptdiagonale links-oben nach rechts-unten gewendete Matrix) bezeichnet. Bei Eigenmultiplikationen kann man sich diese Transposition sowie die Berechnung aller unteren Diagonalelemente der Ergebnismatrix R aber sparen, da bei diesen Operationen immer eine quadratische, diagonalsymmetrische Matrix herauskommt. Das folgende Programmstück erspart also eine Menge Doppel-gemoppel und, vor allem bei größeren Matrizen, viel Rechenzeit.
Hinweis: Auf quadratisch-symmetrische Matrizen lassen sich auch andere Operationen besonders effizient anwenden, etwa die Spiegelungsoperationen des Algorithmus von Alston Scott Householder, das Jacobiverfahren, die Givens-Rotation oder die schrittweise Eigenwert-Faktorenermittlung nach Von_Mises.
WindowTitle "Beschleunigte Eigenmultiplikation R=X'X einer Matrix X"
Windowstyle 24:Window 0,0-%maxx,%maxy
set("decimals",17):set("numwidth",26)
var n&=4:var m&=3
declare x![n&-1,m&-1],k&,x#
dim x#,8*m&*n&:k&=x#:x#=addr(x![0,0]):float x#,0=\
1,2,1, 2,3,3, 3,2,1, 2,1,1
' 1.1 , 2.2 , 3.33/10^2 ,\
' 4 , 5 , 6.6 ,\
' 7.7E2, 8.88, 9.9999 ,\
'10.0 ,11.11,12.3456
x#=k&:dispose x#
declare i&,j&,s!,R![m&-1,m&-1]
whileloop 0,m&-1:k&=&Loop:s!=0
Whileloop 0,n&-1
s!=s!+SQR(x![&Loop,k&])
endwhile
R![k&,k&]=s!
endwhile
Whileloop 0,m&-1:k&=&Loop
Whileloop k&+1,m&-1:j&=&Loop:s!=0
whileloop 0,n&-1:i&=&Loop
s!=s!+x![i&,j&]*x![i&,k&]
endwhile
R![j&,k&]=s!
R![k&,j&]=s!
endwhile
endwhile
'Show
whileloop 0,m&-1:i&=&Loop
whileloop 0,m&-1:k&=&Loop
print tab(k&*28);R![i&,k&],
endwhile:print
endwhile
waitinput
|
|
|
| XProfan 11Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'... | 19.05.2021 ▲ |
|
|
|