Каков наилучший способ сохранить матрицу 16 × (2 ^ 20) в MATLAB? - PullRequest
5 голосов
/ 24 мая 2010

Я думаю о записи данных в файл. У кого-нибудь есть пример того, как записать большой объем данных в файл?

Редактировать: Большинство элементов в матрице являются нулями, другие uint32. Я предполагаю, что самые простые save() и load() будут работать, как предложил @Jonas.

Ответы [ 3 ]

6 голосов
/ 25 мая 2010

Полагаю, никто не видел правку об нулях:)

Если они в основном нулевые, вам следует преобразовать матрицу в ее разреженное представление и , а затем сохранить ее.Вы можете сделать это с помощью функции sparse .

Code

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    

Я не думаю, что разреженная реализацияпредназначен для обработки uint32.

3 голосов
/ 24 мая 2010

Если вы заинтересованы в том, чтобы размер файла данных был как можно меньше, вот несколько советов:

  • Записать данные в двоичный файл (то есть, используя FWRITE ) вместо текстового файла (то есть, используя FPRINTF ).
  • Если ваши данные содержат все целочисленные значения, преобразуйте их или сохраните как целочисленный тип со знаком или без знака вместо используемого по умолчанию типа с двойной точностью , который использует MATLAB.
  • Если ваши данные содержат значения с плавающей запятой, но вам не нужен диапазон или разрешение по умолчанию тип двойной точности , преобразуйте его или сохраните как тип с одинарной точностью .
  • Если ваши данные достаточно разрежены (т.е. в вашей матрице гораздо больше нулей, чем ненулевых), то вы можете использовать функцию FIND , чтобы получить индексы строк и столбцов ненулевого значения. значения, затем просто сохраните их в свой файл.

Вот пара примеров для иллюстрации:

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

Файлы, созданные выше, будут сильно отличаться по размеру. Размер файла 'data_double.dat' составит около 131 073 КБ, 'data_uint8.dat' - около 16 385 КБ, а 'data_sparse.dat' - менее 2 КБ.

Обратите внимание, что я также записал данные \ векторные размеры в файлы, чтобы данные могли быть считаны обратно (используя FREAD ) и правильно изменены. Также обратите внимание, что если бы я не предоставлял аргумент 'double' или 'uint8' для FWRITE , MATLAB был бы достаточно умен, чтобы понять, что ему не нужно использовать двойную точность по умолчанию, и он будет использовать только 8 бит для записи значений данных (так как все они равны 0 и 1).

2 голосов
/ 24 мая 2010

Как генерируются данные?Как вам нужен доступ к данным?

Если я правильно вычисляю, переменная меньше 200 МБ, если она все двойная.Таким образом, вы можете легко сохранить и загрузить его как один файл .mat, если вам нужен доступ к нему только из Matlab.

%# 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')
...