Что лучший способ состоит в том, чтобы сохранить 16 × (2^20) матрица в MATLAB?

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

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

5
задан gnovice 23 May 2017 в 03:26
поделиться

3 ответа

Думаю, никто не видел правки, касающейся нулей :)

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

Код

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

Вывод

Name          Size                   Bytes  Class     Attributes

  z         10000x10000            800000000  double  

Name          Size               Bytes  Class     Attributes

  z         10000x10000            40016  double    sparse    

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

6
ответ дан 13 December 2019 в 19:22
поделиться

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

Если я правильно подсчитал, переменная будет меньше 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')
2
ответ дан 13 December 2019 в 19:22
поделиться

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

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

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

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 был бы достаточно умен, чтобы выяснить, что это не так. t необходимо использовать двойную точность по умолчанию и использовать только 8 бит для записи значений данных (поскольку все они равны 0 и 1).

3
ответ дан 13 December 2019 в 19:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: