WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Matrix Invertieren

 

muhmar
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 16.07.08
Wohnort: ---
Version: 7.4
     Beitrag Verfasst am: 18.03.2009, 10:21     Titel: Matrix Invertieren
  Antworten mit Zitat      
Hey Leute,
ich habe mir in Matlab eine Anwendung geschrieben, die auf der statistischen Ausgleichung einer Kugel aus n-Punkten beruht. Wie in der Statistik üblich, muss ich zur Berechnung der ausgeglichenen Parameter verschiedene Matrizen invertieren.

Nun das Problem:
1. Wenn ich diese Anwendung durchführe, mit z.B. 25000 Punkten, kommt die Fehlermeldung:

??? Out of memory. Type HELP MEMORY for your options.

Dies bedeutet wohl, dass ich diese Invertierung mit meinem PC-Sytem nicht durchführen kann. Zwecks Arbeitsspeicher und oder Ähnlichem.

2. Ist es irgendwie möglich die Invertierung zu vereinfachen, bzw. zu stückeln? Gibt es da schon Ansätze?

gruß
Muhmar
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden


Helmert
Forum-Century

Forum-Century


Beiträge: 121
Anmeldedatum: 04.09.08
Wohnort: Karlsruhe
Version: 2011a
     Beitrag Verfasst am: 18.03.2009, 11:10     Titel:
  Antworten mit Zitat      
Hallo muhmar,

die Schätzung von Kugelparametern sollte im Prinzip möglich sein, ohne so große Matrizen invertieren zu müssen. Ist die Matrix, die du invertieren mußt, wirklich vollbesetzt, oder evtl. nur eine Diagonalmatrix? In diesem Fall würde es genügen, nur die Diagonale zu berechnen. Invertieren kann man dann durch elementweise Kehrwertbildung.

Gruß
Helmert
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 18.03.2009, 14:26     Titel:
  Antworten mit Zitat      
Auch wenn ein mathematisch anderer Ansatz vielleicht das Beste ist - ein Test unter einer 64 Bit Umgebung (== Prozessor und Betriebssystem und MATLAB) könnte sich schon lohnen. Zumindest von der MATLAB-Seite her ist das für Industrie- und Hochschulkunden nicht mit zusätzlichen Kosten verbunden.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Milo
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 19.03.09
Wohnort: KA
Version: ---
     Beitrag Verfasst am: 19.03.2009, 19:39     Titel:
  Antworten mit Zitat      
Hi,

Du könntest auch versuchen, mit dünnbesetzten Matrizen zu arbeiten. Matlab bietet Dir sparse-Matrizen an. Hier werden nur Elemente gespeichert, die ungleich Null sind. Wenn Du, wie Helmert vermutet, viele Nullelemente hast, könnte das bereits reichen.

Schöne Grüße
Micha
_________________

Die Geodäten - Portal für Vermesser und Geoinformatiker || Freie Ausgleichungssoftware
Private Nachricht senden Benutzer-Profile anzeigen
 
muhmar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 16.07.08
Wohnort: ---
Version: 7.4
     Beitrag Verfasst am: 20.03.2009, 09:53     Titel:
  Antworten mit Zitat      
Naja, obs wirklich an der Invertierung liegt, glaub ich selber nichtmehr. Je nachdem mit welcher Punktmenge ich rangehe, so bricht er an unterschiedlichen Stellen ab. Teilweise an Stellen an dennen nur eine Matrix durch multiplizieren erstellt wird. Ich vermute eigentlch mittlerweile, dass der Arbeitsspeicher nicht ausreicht... Unirechner halt...

gruß und danke für die Antworten.
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Milo
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 19.03.09
Wohnort: KA
Version: ---
     Beitrag Verfasst am: 20.03.2009, 17:00     Titel:
  Antworten mit Zitat      
Hallo,

ja, das Problem tritt auf, wenn Du mit den Ressourcen etwas großzügig haushaltest.

Einfache Möglichkeiten. Einmal mit SPARSE, wie ich schon schrieb, dann durch Zwischenspeichern und Laden der nicht benötigten Matrizen und letztlich durch Optimierung Deines Codes.

Die ersten Beiden sind recht simple. Eine Sparse Matrix erzeugst Du mit dem Befehl
Code:


mit S kannst Du nun ganz normal weiterarbeiten bspw:

Code:
ST = S';
Sinv = inv(S);


da Du M nicht mehr benötigst, weg damit:

Code:


Die erzeugten Matrizen (ST und Sinv) sind automatisch wieder sparse-Matrizen.
Was bringt sowas. Nehmen wir an, Du hast eine quadratische diagonale Matrix, in der Vermessung bspw. sind die Gewichtsmatrizen idR Diagonalmatrizen (oder Bandmatrizen), dann reicht es doch, wenn Du statt der n*n-Elemente nur n-Elemente (und zwar die Hauptdiagonale) speicherst.

Code:

P = diag([2 5 7 9 1 5 6 7 3])
sP = sparse(P)


Wenn Du nun mal den Speicherverbrauch abfragst, dann siehst Du den Gewinn (~4.5fach):

Code:

>> whos P
  Name      Size            Bytes  Class     Attributes

  P         9x9               648  double              

>> whos sP
  Name      Size            Bytes  Class     Attributes

  sP        9x9               148  double    sparse    

>>
 


Das ganze macht natürlich nur Sinn, wenn Du auch fleißig mit clear nicht benötigten Speicher frei gibst! Wenn Du am Ende wieder eine "richtige" Matrix haben möchtest, ist full dein Freund.

Die andere Möglichkeit ist das tmp. Zwischenspeichern der Matrizen, die viel Platz benötigen aber aktuell nicht benutzt werden. Hierfür einfach die Matrizen mit save auf die Platte schreiben, den Speicher der Matrix mit clear frei geben und bei Bedarf die Matrix mit load wieder holen.

An Deiner Normalgleichung selbst kann es ja nicht liegen, da diese ja bei der Kugel lediglich eine 4*4 Matrix ist.

Die Fehlermeldung ist im Übrigen unabhängig von der Ausstattung des PCs.

Gruß Micha
_________________

Die Geodäten - Portal für Vermesser und Geoinformatiker || Freie Ausgleichungssoftware
Private Nachricht senden Benutzer-Profile anzeigen
 
muhmar
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 16.07.08
Wohnort: ---
Version: 7.4
     Beitrag Verfasst am: 21.03.2009, 13:28     Titel:
  Antworten mit Zitat      
Was mich jetzt noch ein bischen irritiert ist, dass ich diese Sparsefunktion erst anwenden kann, wenn die Matrix geschrieben ist. Ist es vielleicht möglich, die Zielmatrix als eine "sparse"Matrix zu definieren, dass er in der laufenden for Schleife direkt nur die Hauptdiagonalenelemente speichert?

Soweit wars aber schonmal hilfreich...
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Helmert
Forum-Century

Forum-Century


Beiträge: 121
Anmeldedatum: 04.09.08
Wohnort: Karlsruhe
Version: 2011a
     Beitrag Verfasst am: 22.03.2009, 11:40     Titel:
  Antworten mit Zitat      
Ein Blick auf die Hilfeseite der sparse-Funktion gibt hier Aufschluß. Mit
Code:
kannst du eine leere (d. h. implizit mit lauter Nullen gefüllte) Sparse-Matrix initialisieren, deren von null verschiedenen Elemente du dann anschließend nach und nach zuweisen kannst. Beispiel:

Code:

S = sparse(15,15);
for i = 1:15
  S(i,i) = 2*i;
end
 


... oder das gleiche einfacher mit einer einzigen Anweisung:

Code:

S = sparse(1:15,1:15,2:2:30,15,15);
 


siehe auch:

Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.