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

unnötige Nullen abschneiden

 

rooky
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 76
Anmeldedatum: 25.04.12
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 17.06.2013, 13:20     Titel: unnötige Nullen abschneiden
  Antworten mit Zitat      
Hallo Gemeinde,
ich möchte aus einer berechneten Matrix alle unnötigen Nullen der Zahlen wegscheiden. Hintergrund des Frage ist, dass ich die Matrix möglichst klein (von der Datengröße) haben möchte. Das Beispiel könnte täuschen, denn ich hab viele ganz große Vektoren abzuspeichern (xGB).
Hier das Beispiel:
Code:
a=[1 2 3 4; 5 6 7 8;0 1 0 0];
b=a/2+3-3;
save('Name','b' )

Als Ergebnis bekomme ich :
Code:
b =
    0.5000    1.0000    1.5000    2.0000
    2.5000    3.0000    3.5000    4.0000
         0       0.5000    0            0

Haben möchte ich aber:
Code:
b =
    0.5    1    1.5    2
    2.5    3    3.5    4  
       0    0    0      0

Es könnte auch mal 3.67800 stehen, dann sollte das auf 3.678 geändert werden. Ich will nicht runden, nur die überflüssigen Nullen wegschneiden.

Danke
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: 17.06.2013, 14:41     Titel:
  Antworten mit Zitat      
SAVE schreibt ein komprimiertes MAT File. Ich bezweifle man spart Speicherplatz durch irgendwelche Klimmzüge.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
markuman
Forum-Guru

Forum-Guru


Beiträge: 320
Anmeldedatum: 14.12.12
Wohnort: ---
Version: 2013a/2013b, Octave 3.6.4, 3.7.7
     Beitrag Verfasst am: 17.06.2013, 14:54     Titel:
  Antworten mit Zitat      
Wenn du Speicher sparen willst, nutze sparse. Dann sparst du dir alle 0 Werte in einer Matrix.
_________________

DIY OR DIE Cool

entropie=char(floor(94*rand(1, round(100.*rand)) + 32))
https://github.com/markuman
Private Nachricht senden Benutzer-Profile anzeigen
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 17.06.2013, 17:14     Titel:
  Antworten mit Zitat      
Hallo,

die Nullen kommen vom Datentyp double. Da braucht jede Zahl nun mal 8 Byte (auch die 0 selbst).
Wenn du an der Genauigkeit einsparst, kannst du auch am Speicherbedarf sparen. Der Datentyp float heißt hier single, dieser verbraucht nur die Hälfte des Speichers.

Code:

null = double(0);
null_s = single(0);
whos('null')   % Ein Double braucht 8 Byte
whos('null_s')  % Ein Float braucht 4 Byte

a=[1 2 3 4; 5 6 7 8;0 1 0 0];
b=a/2+3-3;
b_s = single(b);
whos('b')   % 4*3 Doubles brauchen 4*3*8 = 96 Byte
whos('b_s') % 4*3 Floats brauchen 4*3*4 = 48 Byte
 


Grüße,
Nras
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: 18.06.2013, 00:06     Titel: Re: unnötige Nullen abschneiden
  Antworten mit Zitat      
Hallo rooky,

Die "unnötigen Nullen" erscheinen nur bei der Ausgabe ins Command-Window. Hier kann man die Darstellung mit dem FORMAT-Befehl anpassen:

Code:
a = [1 2 3 4; 5 6 7 8;0 1 0 0];
b = a/2+3-3;

% Mit nicht-signifikanten Nullen:
format short
disp(b)

% Ohne nicht-signifikante Nullen:
format short g
disp(b)

Nun haben nicht alle Dezimal-Zahlen eine exakte Entsprechung als Binär-Zahl, die ja zur internen Speicherung verwendet wird. Bei 0.999999999999999 bliebe also zunächst zu klären, ob das nun 1.0 ist oder nicht.

Oder anders ausgedrückt: Die Zahlen an sich enthalten keine "unnötigen Nullen", sondern alle verwendeten Bits werden benötigt um IEEE754-doubles eindeutig zu definieren. Diese Nullen erscheinen nur bei bestimmten Arten der Ausgabe im Dezimal-Format.

Eine Idee wäre die Verwendung von SINGLE oder einem der Integer-Formate, falls dies möglich ist.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 76
Anmeldedatum: 25.04.12
Wohnort: ---
Version: 2012a
     Beitrag Verfasst am: 18.06.2013, 07:45     Titel:
  Antworten mit Zitat      
Hallo Danke für euere Hilfe.
Ich werde das mal mit single versuchen. Es spart Platz (bei mir ca.2GB). Ich muss jetzt nur nochmal prüfen was mit der Genauigkeit passiert.
P.S. mit sparse wird der Speicherbedarf (bei mir) größer

Danke euch
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.