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

Nullzeilen in Matrix eintragen

 

Ralf1007
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.07.2010, 12:28     Titel: Nullzeilen in Matrix eintragen
  Antworten mit Zitat      
Hallo liebe Matlab-Pros,

eigentlich ist mein Problem so gewaltig nicht. Ich möchte in eine gegebene Matrix Nullzeilen eintragen. Wenn in dem Vektor idx die Nummern der Zeilen stehen, die ersetzt werden sollen, trage ich durch
Code:

A(idx,:) = 0;
 

die Nullzeilen in A ein. Nun dauert das bei mir leider furchtbar lange. Meine Matrix A hat in etwa die Dimension 200000x100000 und idx hat etwa die Länge 4000. Die Codezeile oben nimmt dann so 20 Sekunden in Anspruch.

Ich kann mir nicht vorstellen, dass das tatsächlich soviel Zeit verschlingen muss. Gibt es denn eine schnellere Variante Nullzeilen in eine Matrix einzutragen?

Vielen Dank für Hinweise!

Ralf
Private Nachricht senden Benutzer-Profile anzeigen


yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 28.07.2010, 13:45     Titel:
  Antworten mit Zitat      
Moin Ralf1007,

die von Dir genannte Code-Zeile ist die schnellste Methode, da sie direkt indexiert.
Ich staune eher, dass Du eine Matrix dieser Dimension verarbeiten kannst. Denn eine 8000*8000-Matrix ergibt bereits ca. 500MB Arbeitsspeicher ...
Die genaue Größe gibts mit >>whos

Ciao,
yankemen
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke Smile

Zuletzt bearbeitet von yankemen am 28.07.2010, 14:24, insgesamt einmal bearbeitet
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: 28.07.2010, 13:55     Titel:
  Antworten mit Zitat      
Ich denke auch, dass das Problem eher im Gesamtzusammenhang liegt. Ist das wirklich nötig alles so gross zu machen? Müssen es DOUBLEs sein? Ist vielleicht schon die Operation die den Indexvektor erstellt anders zu machen?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Ralf1007
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.07.2010, 15:13     Titel:
  Antworten mit Zitat      
Hallo,

danke für die Antworten. Was ich noch hätte dazu sagen sollen, ist, dass die Matrix A eine sparse-Matrix ist, sodass ihr Speicherbedarf bei 8 MB liegt. Sie besitzt auch nur die Einträge -1,0 oder 1.

Was meinst du damit, Andreas, den Indexvektor anders zu erstellen? Die Matrix A muss ich von vornherein erstmal ohne Nullzeilen aufbauen und im Anschluss muss ich in den passenden Zeilen Nullen reinschreiben. Der Indexvektor muss also auf jeden Fall diese Zeilen auswählen können.

An der Größe der Matrix lässt sich nichts drehen aber da sie sowieso eine sparse-Matrix ist, ist das vermutlich auch nicht so dramatisch.

Ich danke euch für eure Hilfe.

Ralf
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.07.2010, 18:52     Titel:
  Antworten mit Zitat      
Hallo Ralf,

es wäre hilfreich gewesen, gleich zu schreiben, dass Du eine Sparse-Matrix verwendest. Ich fand ein 160GB-Array zwar ungewöhnlich, aber damit schienst Du keine Probleme zu haben.

Möglicherweise hilft es, wenn Du beim Erstellen der Matrix den Parameter NZMAX größer wählst. Ausserdem könnte es weniger als 20 Sekunden dauern, wenn Du statt eine Zeile auf 0 zu setzen, eine neue Sparsematrix erstellst und alle anderen Zeilen hinein kopierst.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Ralf1007
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 28.07.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.08.2010, 13:34     Titel:
  Antworten mit Zitat      
Hallo,

so wie Jan es vorgeschlagen hat, habe ich es jetzt gemacht. Das heißt, statt durch
Code:

A(idx,:) = 0;
 

in meiner sparse-Matrix A Nullen einzutragen, "kopiere" ich durch
Code:

[i,j,s] = find(A);
index = ~ismember(i,idx);
i = i(index);
j = j(index);
s = s(index);
A = sparse(i,j,s,size(A,1),size(A,2));
 

alle gewünschten alten Einträge in die neue Matrix und an den restlichen Positionen werden ja automatisch Nullen eingetragen, ganz so, wie ich es wollte.

Das geht viel viel schneller, als ich es vorher gemacht habe. Ohne eure Hilfe wäre ich da vermutlich nicht drauf gekommen, daher bedanke ich mich herzlich dafür!

Viele Grüße,

Ralf
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 - 2025 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.