Как сохранить очень крупную матричную матрицу MATLAB в текстовый файл?

У меня есть разрешенная матрица 30000x14000 в MATLAB (версия 7), которую мне нужно использовать в другой программе. Вызов сохранения не будет записывать это как ASCII (не поддерживается). Вызов full() для этого монстра приводит к ошибке Out of Memory.
Как его экспортировать?

Ответы

Ответ 1

Я сохранил его как текст, используя Java в MATLAB. Код MATLAB:


pw=java.io.PrintWriter(java.io.FileWriter('c:\\retail.txt'));
line=num2str(0:size(data,2)-1);
pw.println(line);
for index=1:length(data)
    disp(index);
    line=num2str(full(data(index,:)));
    pw.println(line);
end
pw.flush();
pw.close();

Здесь data - чрезвычайно большая разреженная матрица.

Ответ 2

Вы можете использовать find для получения векторов индекса и значений:

[i,j,val] = find(data)
data_dump = [i,j,val]

Вы можете воссоздать данные из data_dump с spconvert, который предназначен для "Импорт из разреженного матричного внешнего формата" (так что я думаю, что это хороший формат экспорта):

data = spconvert( data_dump )

Вы можете сохранить в ascii с помощью:

save -ascii data.txt data_dump

Но это дает индексы как двойные, вы можете написать его более красиво с помощью fopen/fprintf/fclose:

fid = fopen('data.txt','w')
fprintf( fid,'%d %d %f\n', transpose(data_dump) )
fclose(fid)

Надеюсь, что это поможет.

Ответ 3

Сохраните разреженную матрицу как файл .mat. Затем в другой программе используйте подходящую библиотеку для чтения файла .mat.

Например, если другая программа написана на Python, вы можете использовать функцию scipy.io.mio.loadmat, которая поддерживает разреженные массивы и дает вам разреженную матрицу numpy.

Ответ 4

Вы пытались его разбить?

Я имею в виду попытку вызова full() на 1000 первых строк (или 5000), а затем повторить процесс, если он работает.

Ответ 5

Используйте функцию find для получения индексов ненулевых элементов...

idcs = find(data);
vals = data(idcs);
...save the index vector and value vector in whatever format you want...

Если вы хотите, вы можете использовать ind2sub для преобразования линейных индексов в строки, индексы столбцов.

Если вам нужно воссоздать разреженную матрицу в matlab из индексов + значений, используйте spconvert.

Ответ 6

dlmwrite - записать матрицу в файл с разделителями ASCII Синтаксис

dlmwrite (имя файла, M)

dlmwrite (имя файла, M, 'D')

dlmwrite (имя файла, M, 'D', R, C)

dlmwrite (имя файла, M, 'attrib1', value1, 'attrib2', value2,...)

dlmwrite (имя файла, M, '-append')

dlmwrite (имя файла, M, '-append', список атрибутов)

Ответ 7

Если это в значительной степени одноразовая сделка, тогда я просто перебираю матрицу и записываю матрицу в файл ASCII с помощью грубой силы, иначе используйте @Veynom's и вызовите full() для подмножества строк. Это может занять некоторое время, но, скорее всего, это будет сделано быстрее, чем может потребоваться, чтобы научиться читать в файле .mat вне среды MATLAB.

Если это то, что вам нужно делать на регулярной основе, тогда я бы взял @Vebjorn и воспользовался библиотекой для чтения файла .mat.

Ответ 8

Используйте этот скрипт: msm_to_mm.m, записывает разреженную матрицу MATLAB в файл MatrixMarket.

И эта тема также может быть полезна.