Domanda

Sto pensando di scrivere i dati in un file. Qualcuno ha un esempio di come scrivere una grande quantità di dati in un file?

Modifica La maggior parte degli elementi della matrice sono zeri, gli altri sono uint32. Credo che la save() semplice e load() avrebbe funzionato, come suggerito @Jonas.

È stato utile?

Soluzione

Immagino che nessuno ha visto la modifica sui zeri:)

Se sono per lo più zeri, si dovrebbe convertire la matrice per la sua rappresentazione sparsa e poi salvarlo. È possibile farlo con la funzione sparse .

Codice

z = zeros(10000,10000);
z(123,456) = 1;
whos z
z = sparse(z);
whos z

Output

Name          Size                   Bytes  Class     Attributes

  z         10000x10000            800000000  double  

Name          Size               Bytes  Class     Attributes

  z         10000x10000            40016  double    sparse    

Non credo che l'attuazione sparse è progettato per gestire uint32.

Altri suggerimenti

Se sei preoccupato di mantenere la dimensione del file di dati il ??più piccolo possibile, ecco alcuni suggerimenti:

  • Scrivi i dati in un file binario (vale a dire utilizzando fwrite ) invece di un file di testo (vale a dire utilizzando fprintf ).
  • Se i dati contengono tutti i valori interi, convertirlo o salvarlo come firmato o il tipo intero senza segno al posto del default doppia tipo precisione uso di MATLAB.
  • Se i dati contengono valori in virgola mobile, ma non è necessario il campo o la risoluzione di default doppio tipo di precisione , convertire e o salvarlo come singolo tipo di precisione .
  • Se i dati sono sufficientemente scarsa (per esempio ci sono molti più zeri rispetto ai non-zero nella vostra matrice), quindi è possibile utilizzare il TROVA funzione per ottenere gli indici di riga e di colonna dei non-valori zero, poi basta salvare tali file.

Ecco un paio di esempi per illustrare:

data = double(rand(16,2^20) <= 0.00001);  %# A large but very sparse matrix

%# Writing the values as type double:
fid = fopen('data_double.dat','w');  %# Open the file
fwrite(fid,size(data),'uint32');     %# Write the matrix size (2 values)
fwrite(fid,data,'double');           %# Write the data as type double
fclose(fid);                         %# Close the file

%# Writing the values as type uint8:
fid = fopen('data_uint8.dat','w');  %# Open the file
fwrite(fid,size(data),'uint32');    %# Write the matrix size (2 values)
fwrite(fid,data,'uint8');           %# Write the data as type uint8
fclose(fid);                        %# Close the file

%# Writing out only the non-zero values:
[rowIndex,columnIndex,values] = find(data);  %# Get the row and column indices
                                             %#   and the non-zero values
fid = fopen('data_sparse.dat','w');  %# Open the file
fwrite(fid,numel(values),'uint32');  %# Write the length of the vectors (1 value)
fwrite(fid,rowIndex,'uint32');       %# Write the row indices
fwrite(fid,columnIndex,'uint32');    %# Write the column indices
fwrite(fid,values,'uint8');          %# Write the non-zero values
fclose(fid);                         %# Close the file

I file creati sopra varierà drasticamente in termini di dimensioni. Il file 'data_double.dat' sarà di circa 131.073 KB, 'data_uint8.dat' sarà di circa 16.385 KB, e 'data_sparse.dat' sarà inferiore a 2 KB.

Si noti che ho scritto anche i dati \ formati vettoriali per i file in modo che i dati possono essere letti nel (utilizzando FREAD ) e rimodellato in modo corretto. Si noti anche che se non ha fornito un argomento 'double' o 'uint8' a fwrite , MATLAB sarebbe abbastanza intelligente da capire che non ha bisogno di utilizzare la doppia precisione di default e sarebbe utilizzare solo 8 bit di scrivere i valori dei dati (dal momento che sono tutti 0 e 1).

Come si genera i dati? Come è necessario per accedere ai dati?

Se ho calcolato correttamente, la variabile è inferiore a 200 MB se è tutto doppio. Così, si può facilmente salvare e caricare come un unico file .mat se è necessario accedervi da Matlab solo.

%# 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')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top