Как сохранить очень большую разреженную матрицу MATLAB в текстовом файле? - PullRequest
16 голосов
/ 20 октября 2008

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

Ответы [ 8 ]

28 голосов
/ 18 декабря 2008

Вы можете использовать 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)

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

7 голосов
/ 20 октября 2008

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

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

3 голосов
/ 27 октября 2008

Я сохранил его как текст, используя 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 голосов
/ 20 октября 2008

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

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

1 голос
/ 12 сентября 2010

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

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

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

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

dlmwrite (имя файла, M, 'attrib1', значение1, 'attrib2', значение2, ...)

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

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

1 голос
/ 27 октября 2008

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

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

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

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

0 голосов
/ 20 января 2019

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

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

0 голосов
/ 20 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...