Wie kann ich eine sehr große MATLAB Sparse Matrix in einer Textdatei speichern?

StackOverflow https://stackoverflow.com/questions/217852

  •  03-07-2019
  •  | 
  •  

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top