Quelle est la meilleure façon de stocker un 16 x (2 ^ 20) matrice dans Matlab?
Question
Je pense à écrire les données dans un fichier. Quelqu'un at-il un exemple de la façon d'écrire une grande quantité de données dans un fichier?
Edit: La plupart des éléments dans la matrice sont des zéros, d'autres sont uint32
. Je suppose que le plus simple save()
et load()
travailleraient, comme @Jonas suggéré.
La solution
Je suppose que personne a vu l'édition sur les zéros:)
Si elles sont la plupart du temps des zéros, vous devez convertir votre matrice à sa représentation clairsemée et puis enregistrez-le. Vous pouvez le faire avec la fonction clairsemée .
code
z = zeros(10000,10000);
z(123,456) = 1;
whos z
z = sparse(z);
whos z
Sortie
Name Size Bytes Class Attributes
z 10000x10000 800000000 double
Name Size Bytes Class Attributes
z 10000x10000 40016 double sparse
Je ne pense pas que la mise en œuvre clairsemée est conçu pour gérer uint32
.
Autres conseils
Si vous êtes intéressés à garder la taille du fichier de données aussi faible que possible, voici quelques suggestions:
- Ecrire les données dans un fichier binaire (par exemple en utilisant FWRITE ) au lieu de un fichier texte (par exemple en utilisant fprintf ).
- Si vos données contient toutes les valeurs entières, convertir ou enregistrer en tant que signé ou entier non signé au lieu de la valeur par défaut les utilisations de type double MATLAB® de précision.
- Si vos données contiennent des valeurs à virgule flottante, mais vous n'avez pas besoin de la plage ou la résolution de la valeur par défaut à double type de précision, le convertir ou l'enregistrer comme simple type de précision.
- Si vos données sont suffisamment rares (autrement dit, il y a beaucoup plus de zéros que les non-zéros dans votre matrice), vous pouvez utiliser le FREAD ) et remodelé correctement. Notez également que si je ne l'ai pas fournir un argument
'double'
ou'uint8'
FWRITE , Matlab serait assez intelligent pour comprendre qu'il n'a pas besoin d'utiliser la double précision par défaut et n'utiliserait 8 bits pour écrire les valeurs de données (car elles sont toutes 0 et 1).
Comment les données sont générées? Comment avez-vous besoin d'accéder aux données?
Si je calcule bien, la variable est inférieure à 200 Mo si elle est tout double. Ainsi, vous pouvez facilement enregistrer et charger en un seul fichier .mat si vous devez y accéder à partir Matlab seulement.
%# create data
data = zeros(16,2^20);
%# save data
save('myFile.mat','data');
%# clear data to test everything works
clear data
%# load data
load('myFile.mat')