Wie kann ich eine sehr große MATLAB Sparse Matrix in einer Textdatei speichern?
Frage
Ich habe eine 30000x14000 Sparse Matrix in MATLAB (Version 7), die ich in einem anderen Programm verwenden muß. speichern Aufruf wird dies nicht schreiben als ASCII (nicht unterstützt). Der Aufruf full()
auf dieses Monster führt zu einem Out of Memory
Fehler.
Wie kann ich es exportieren?
Lösung 3
Ich speicherte es als Text mit Hilfe von Java in MATLAB. MATLAB-Code:
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();
Hier data
ist eine extrem große Sparse Matrix.
Andere Tipps
Sie können mit finden Index & Wert-Vektoren erhalten:
[i,j,val] = find(data)
data_dump = [i,j,val]
Sie können Daten aus data_dump mit spconvert neu erstellen, die auf „Import aus Sparse Matrix externem Format“ gemeint ist (also denke ich, es ist ein gutes Exportformat):
data = spconvert( data_dump )
Sie können zu ascii speichern mit:
save -ascii data.txt data_dump
Aber diese Dumps Indizes als doppelt, Sie können es mehr schön schreiben mit fopen / fprintf / fclose:
fid = fopen('data.txt','w')
fprintf( fid,'%d %d %f\n', transpose(data_dump) )
fclose(fid)
Hope, das hilft.
Speichern Sie die Sparse Matrix als .mat
Datei. Dann wird in dem anderen Programm, eine geeignete Bibliothek verwenden, um die .mat
Datei zu lesen.
Zum Beispiel, wenn das andere Programm in Python geschrieben ist, können Sie die scipy.io.mio.loadmat
Funktion verwenden, die spärlichen Arrays unterstützt und gibt Ihnen eine spärliche numpy Matrix.
Haben Sie es versuchen Partitionieren?
meine ich versuchen, voll () aufrufen, auf den ersten 1000 Zeilen (oder 5000) und dann den Vorgang wiederholen, wenn es funktioniert.
Mit der find
Funktion die Indizes von Nicht-Null-Elementen erhalten ...
idcs = find(data);
vals = data(idcs);
...save the index vector and value vector in whatever format you want...
Wenn Sie möchten, können Sie ind2sub
verwenden, um die lineare Indizes umwandeln zu Zeile, Spalte Indizes.
Wenn Sie eine Sparse Matrix in Matlab von Indizes + Werten, die Verwendung spconvert
neu erstellen.
dlmwrite - Schreiben Matrix ASCII-Datei mit Trennzeichen Syntax
dlmwrite (Dateiname, M)
dlmwrite (Dateiname, M, 'D')
dlmwrite (Dateiname, M 'D', R, C)
dlmwrite (Dateiname, M, 'attrib1', value1, 'attrib2', Wert2, ...)
dlmwrite (Dateiname, M, '-append')
dlmwrite (Dateiname, M, '-append', Attribut-Wert-Liste)
Wenn dies so ziemlich ist eine einmalige Sache, dann würde ich durch die Matrix durchlaufen gerade und schreiben Sie die Matrix in eine ASCII-Datei mit roher Gewalt oder sonst verwenden @ Vorschlag des Veynom und rufe voll () auf einer Teilmenge von Zeilen. Es kann eine Weile dauern, aber es wird wahrscheinlich schneller erfolgen, als es vielleicht zu lernen, wie in einer .mat Datei außerhalb der MATLAB-Umgebung zu lesen.
Wenn das man etwas braucht auf wiederkehrender Basis zu tun, dann würde ich nehmen @ Vebjørn 's Beratung und verwendet eine Bibliothek, die die .mat Datei zu lesen.
Verwenden Sie dieses Skript: msm_to_mm.m , eine MATLAB sparse Matrix zu einer MatrixMarket Datei schreibt.
Und diese Faden kann auch nützlich sein.