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

Welches Zahlenformat für geringsnötigen Speicherbedarf

 

FrenktheCast
Forum-Anfänger

Forum-Anfänger


Beiträge: 41
Anmeldedatum: 23.11.07
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 02.03.2016, 14:53     Titel: Welches Zahlenformat für geringsnötigen Speicherbedarf
  Antworten mit Zitat      
Hallo,

ich hab ein Array mit 14400 x 14400 Werten. Da die Berechnungen dieser 200 mio Werte sehr aufwendig sind möchte ich diese abspeichern. Aktuell benötigt das Array als .mat 950mb Speicherplatz.

Es sind Zahlen zwischen -180 und 20.000 die Dezimalstellen besitzten. Die Dezimalstellen könnten notfalls weggelassen werden. (Auf eine Nachkommastelle wäre ausrechend exakt)

Welches Format sollten die Zahlen haben um beim speichern als Mat zahl so wenig speicher wie nötig zu benötigen?

Danke euch
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 02.03.2016, 15:31     Titel:
  Antworten mit Zitat      
falls deine matrix dünn besetzt ist könnte sich eine umwandlung in sparse lohnen.
wenn nur eine nachkomma stelle interessant ist könntest du auch mit 10 multiplizieren und int16 benutzen.
das ist jedenfalls das, was mir dazu einfällt.
grüße
_________________

richtig Fragen
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: 02.03.2016, 16:57     Titel: Re: Welches Zahlenformat für geringsnötigen Speicherbedarf
  Antworten mit Zitat      
Hallo FrenktheCast,

Welches MAT-File Format benutzt Du denn? In manchen wird komprimiert, in anderen nicht. In den Preferences kann man das einstellen, oder beim SAVE Befehl.

Mit 10 zu multiplizieren und INT16 zu verwenden reicht nicht, wenn du 20'000 als Wert hast und eine Nachkommastelle verwendest, denn INT16 speichert nur Zahlen bis 65.535. Wenn Du stattdessen INT32 nimmst, benötigt das so viel Platz wie SINGLE. Dann würde ich gleich letzteres bevorzugen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 02.03.2016, 17:06     Titel:
  Antworten mit Zitat      
Zitat:
Mit 10 zu multiplizieren und INT16 zu verwenden reicht nicht, wenn du 20'000 als Wert hast und eine Nachkommastelle verwendest,

das stimmt. ich hatte irgendwie 20 im kopf als ich das geschrieben habe. also -180 bis 20
_________________

richtig Fragen
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: 02.03.2016, 17:56     Titel:
  Antworten mit Zitat      
Lieber Winkow,

Es tut mir sehr leid, dass Du 20 im Kopf hattest. Das muss sich seltsam anfühlen. :-)

Wenn man noch den Offset abzieht könnte man sich das Vorzeichen sparen:
Code:
data = randi([-180, 20000], 1, 1000) + rand(1, 1000);  % Test data
Offset = min(data);
dataNoOffset = data - Offset;
Scale = max(dataNoOffset);
dataUint16 = uint16(dataNoOffset * (intmax('UINT16') / Scale));

save('TestData.mat', 'dataUint16', 'Scale', 'Offset');

F = load('TestData.mat');
Restored = double(F.dataUint16) * (F.Scale / intmax('UINT16')) + F.Offset;

% Check difference:
max(abs(data - Restored))

Dies speichert die Daten so genau wie möglich mit 16 Bits pro Wert.

Bitte testen! Ich habe gerade kein Matlab zur Verfügung.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 41
Anmeldedatum: 23.11.07
Wohnort: ---
Version: R2012b
     Beitrag Verfasst am: 03.03.2016, 09:12     Titel:
  Antworten mit Zitat      
Ich hab das jetzt mit int16 ohne Kommastellen gelöst. Danke für die Hinweise!

Code:

a=magic(4)
b=single(a);
c=int16(a);
whos
 


Hab jetzt 1. Milliarde Werte im Array was dann 1,53 Gb verbraucht. Gespeichert wird "ohne" weitere Preferences. Also müsste eigentlich in '-v7.3'.

Jan S, wenn ich dein Code vollständig durchblicke würde dein Vorschlag einen Mehrwert zur reinen int16 Variante bringen, da hier die erste Dezimalstelle mitgenommen werden kann kann?

Blöde Frage: Bei int16 (u.a.) macht es doch beim Speicherplatz keinen Unterschied welchen numerischen Wert die Zahl besitzt - es sind doch immer 16 bit belegt oder?

Danke euch
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: 03.03.2016, 11:42     Titel:
  Antworten mit Zitat      
Hallo FrenktheCast,

Zitat:
Jan S, wenn ich dein Code vollständig durchblicke würde dein Vorschlag einen Mehrwert zur reinen int16 Variante bringen, da hier die erste Dezimalstelle mitgenommen werden kann kann?

Es würde zumindest der mögliche Zahlenraum der 16 Bits optimal genutzt. Falls Du nur Zahlen zwischen -180 und 180 hast, würden entsprechend mehr Nachkommastellen gespeichert werden.

Zitat:
Blöde Frage: Bei int16 (u.a.) macht es doch beim Speicherplatz keinen Unterschied welchen numerischen Wert die Zahl besitzt - es sind doch immer 16 bit belegt oder?

Solange die daten nicht komprimiert werden, hast Du recht. Falls sie komprimiert werden, hängt es auch noch davon ab, wie stark die Werte korreliert sind.

Gruß, Jan
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.