| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: Invertieren einer Matix (1365 mal gelesen)
|
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 11. Jun. 2007 14:52 <-- editieren / zitieren --> Unities abgeben:
Servus! Passt zwar nicht ganz in dieses Forum aber ich probier's trotzdem mal hier. Ich suche einen Algorithmus zum Invertieren einer Matrix. Bin jetzt seit Stunden in Google unterwegs und finde leider keine passende Seite die das Verfahren verständlich erklärt bzw. programmierbar darstellt. Schön wäre Gauss-Jordan mit Pivotisierung. [Edit] Muss auch für Matrizen größer 3x3 funktionieren [Edit] Evtl. hat einer von Euch eine passende Lösung oder link. Ciao Georg [Diese Nachricht wurde von gmk am 11. Jun. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 11. Jun. 2007 15:35 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Geht es um schwach besetzte Matrizen? Da hätte ich was aus meiner Diplomarbeit (Optimierung/Ausgleichung geod. Lagesysteme) ist allerdings Pascal. Ich wollts schon immer mal in Lisp umschreiben (bin aber die letzten 15 Jahre nicht dazu gekommen). ------------------ Mit freundlichem Gruß Udo Hübner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13529 Registriert: 30.11.2003 .
|
erstellt am: 11. Jun. 2007 15:44 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Vielleicht ist da was bei, ist allerdings C. Eine Umsetzung in Lisp davon ist IMHO in ll-matix.lsp zu finden. Vieleicht kannst du ja was allgemeingültiges, schön auf deutsch auskommentiertes d'raus basteln und dann hier posten. ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 11. Jun. 2007 16:24 <-- editieren / zitieren --> Unities abgeben:
@Udo Pascal würde sehr gut passen :-), vielleicht sogar Turbo? Sind leider alle Stellen besetzt, es geht um die Überbestimmung eines Kreises (Kreisbogens, Radius). Spielt das bei deinem Code eine Rolle ob schwach oder ganz besetzt? Könnte ja sein, dass von jedem Standpunkt alle anderen beobachtet wurden, dann müsste die Matrix eigentlich voll sein. @Thomas
Danke, werd' mich mal durchkämfpen! Ciao Georg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 11. Jun. 2007 16:35 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Zitat: Original erstellt von gmk: @Udo Pascal würde sehr gut passen :-), vielleicht sogar Turbo? .. Spielt das bei deinem Code eine Rolle ob schwach oder ganz besetzt? ...
Ja, natürlich Turbo Pascal. Die Matritzenberechnugnen arbeiten mit ausgeglichenen Bäumen und indizieren die jeweiligen Matrizenelemente. Nullelemente werden also nicht gespeichert. Anders hätten wir große Matritzen (>200x200 Elemente) vor 15 Jahren gar nicht (in Echtzeit) rechnen können bei 640 KB Arbetisspeicher. Bei vollbesetzten großen Matrizen befürchte ich bei dem Code allerdings Performanceeinbußen. Ich muss erst mal irgendwo ein 5 1/4" zoll Laufwerk ausgraben un die Daten zu sichten. ------------------ Mit freundlichem Gruß Udo Hübner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 11. Jun. 2007 16:51 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von CAD-Huebner: Anders hätten wir große Matritzen (>200x200 Elemente) vor 15 Jahren gar nicht (in Echtzeit) rechnen können bei 640 KB Arbetisspeicher. [/B]
Mit nem Co-Prozessor um 500DM warst dann aber dafür wieder der König :-)) 200/3, 66 Punkte, war wohl eine längere Messung, oder :-) Wäre super wenn du noch was findest, evtl. kann man's ja kompilieren und einbinden wenn's mit den Zeigern zu schwierig wird für eine Umsetzung nach lisp. Ciao Georg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
scj Mitglied
Beiträge: 555 Registriert: 09.08.2001
|
erstellt am: 12. Jun. 2007 16:29 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Der Hinweis aud die 5 1/4"-Disketten war sehr hilfreich... Hier ein Turbo-Pascal-Quelltext mit Literaturangabe. Dort sind übrigens noch weitere Matrizenoperationsbausteine zu finden - allerdings in Basic - aber relativ leicht unzusetzen. Code:
program MATINO; {Matrizeninversion ohne Pivotierung; Quelle: Rothe, Steinbach. BASIC-Programmbausteine. VEB Verlag Technik Berlin 1989, S.73}label M10474,ENDE; const nmax = 100; d1 = 1e-15; type matrixn = array[1..nmax,1..nmax] of real; var n: word; {Dimension des Systems} u: matrixn; {Koeffizientenmatrix} i9,j9,k9 : word; {interne Parameter} p9,f9 : real; {----------------------HP----------------------------------} begin {Einlesen von n und u[n,n]} write('n := ');readln(n); for i9:=1 to n do begin for j9:=1 to n do begin write('u[',i9:2,',',j9:2,']:= ');readln(u[i9,j9]); end; writeln; end; for i9:=1 to n do begin p9:=u[i9,i9]; if abs(p9)<d1 then begin writeln('Werte zu klein!'); goto ENDE; end; for j9:=1 to n do begin if j9=i9 then goto M10474; f9:= u[j9,i9]/p9; for k9:=1 to n do u[j9,k9]:=u[j9,k9]-u[i9,k9]*f9; u[j9,i9]:=-f9; M10474: end; for j9:=1 to n do u[i9,j9]:=u[i9,j9]/p9; u[i9,i9]:=1/p9; end; for i9:=1 to n do begin for j9:=1 to n do write (u[i9,j9]:6:3,' '); writeln; end; ENDE: readln; end.
Mit freundlichen Grüßen aus der Rhön Jochen>>Entschuldigung: Das Programm steht auf Seite 59 und das Buch hat die ISBN 3-341-00621-4 ISSN 0863-0860 Technische Informatik [Diese Nachricht wurde von scj am 12. Jun. 2007 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 12. Jun. 2007 16:58 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13529 Registriert: 30.11.2003 .
|
erstellt am: 12. Jun. 2007 17:01 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Zitat: Original erstellt von gmk: Super Jochen, ersten Test hat's schon bestanden :-)Gibt's in dem Buch auch eine Lösung mit Pivotierung? Ciao Georg
Und? wann können wir mit einer hier geposteten Lispumsetzung rechnen? ------------------ - Thomas - "Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben." Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 12. Jun. 2007 17:06 <-- editieren / zitieren --> Unities abgeben:
|
scj Mitglied
Beiträge: 555 Registriert: 09.08.2001
|
erstellt am: 12. Jun. 2007 17:40 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
Zitat: Original erstellt von gmk:
Gibt's in dem Buch auch eine Lösung mit Pivotierung?Ciao Georg
Ja, auf Seite 60/61. Ist etwa 3x so lang, deswegen habe ich das damals nicht umgesetzt ;-) ... Mit besten Grüßen aus der Rhön Jochen Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9803 Registriert: 01.12.2003 One AutoCAD 2.5 - 2024, AutoCAD, Civil 3D, Win10/Win11
|
erstellt am: 12. Jun. 2007 21:12 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
|
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 15. Jun. 2007 15:12 <-- editieren / zitieren --> Unities abgeben:
Servus! Wie versprochen hier der Lisp-Code. ;******Matrizeninversion ohne Pivotierung**********
;Quellen ;Rothe, Steinbach. BASIC-Programmbausteine. ;VEB Verlag Technik Berlin 1989, S.59 ;http://ww3.cad.de/foren/ubb/Forum145/HTML/002135.shtml ;http://ww3.cad.de/foren/ubb/Forum145/HTML/001379.shtml ;Beispiel ;(minv '((2.067754319 -0.522264875 0.725318064) (-0.522264875 1.932245681 -0.777974436) (0.725318064 -0.777974436 4))) ;((0.539188 0.115409 -0.0753244) (0.115409 0.586205 0.0930861) (-0.0753244 0.0930861 0.281763)) ;gmk-cad@arcor.de 2007 (defun L:SUBST_POSITION (LISTE #pos #new / returnLIST) (repeat #pos (setq returnLIST (cons (car LISTE) returnLIST) LISTE (cdr LISTE) ) ) (append (reverse returnLIST) (list #new) (cdr LISTE) ) ) (DEFUN array-aendern (array zeile spalte wert) (L:SUBST_POSITION array zeile (L:SUBST_POSITION (NTH zeile array) spalte wert)) ) (DEFUN array-holen (array zeile spalte) (NTH spalte (NTH zeile array)) ) (DEFUN minv ( matrix ;zeilenweise / n ;Dimension des Systems iz,is,k9 ;interne Parameter p9 ;diagonale f9 k9 iz is ;index zeile,spalte fehler ) (SETQ n (LENGTH matrix)) (SETQ iz 0) (REPEAT n (SETQ p9 (array-holen matrix iz iz)) (IF (OR (< p9 0.000000000000001) fehler) (SETQ fehler T)) (IF (NOT fehler) (PROGN (SETQ is 0) (REPEAT n (IF (/= is iz) (PROGN (SETQ f9 (/ (array-holen matrix is iz) p9)) (SETQ k9 0) (REPEAT n (SETQ matrix (array-aendern matrix is k9 (- (array-holen matrix is k9) (* (array-holen matrix iz k9) f9)))) (SETQ k9 (1+ k9)) ) (SETQ matrix (array-aendern matrix is iz (* -1 f9))) ) ;progn ) ;if (SETQ is (1+ is)) ) ;repeat (SETQ is 0) (REPEAT n (SETQ matrix (array-aendern matrix iz is (/ (array-holen matrix iz is) p9))) (SETQ is (1+ is)) ) (SETQ matrix (array-aendern matrix iz iz (/ 1 p9))) (SETQ iz (1+ iz)) matrix ) ;progn ) ;if NOT fehler ) ;repeat )
Sobald ich das Buch hier habe, werd' ich mich an die Inversion mit Pivotierung ranmachen. Ciao Georg
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
gmk Mitglied Dipl.-Ing.(FH) Vermessung
Beiträge: 669 Registriert: 23.10.2002 Autocad 2004, WS CadCompass, Normica V2000, WinXP Prof., AMD Athlon 64 X2, 2GB, NVIDIA GeForce 7600GS, HP1055CM
|
erstellt am: 15. Jun. 2007 19:21 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von scj: Ja, auf Seite 60/61. Ist etwa 3x so lang, deswegen habe ich das damals nicht umgesetzt ;-) ... Mit besten Grüßen aus der Rhön Jochen
Hi Jochen! Das Buch (hab's heute bekommen) ist Gold wert. Danke für den super Tipp. Ciao Georg Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
scj Mitglied
Beiträge: 555 Registriert: 09.08.2001
|
erstellt am: 15. Jun. 2007 20:13 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13529 Registriert: 30.11.2003 .
|
erstellt am: 10. Feb. 2008 09:14 <-- editieren / zitieren --> Unities abgeben: Nur für gmk
|