Если вы заинтересованы в том, чтобы размер файла данных был как можно меньше, вот несколько советов:
- Записать данные в двоичный файл (то есть, используя 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).