Comment enregistrer une très grande matrice fragmentée MATLAB dans un fichier texte?

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

  •  03-07-2019
  •  | 
  •  

Question

J'ai une matrice fragmentée 30000x14000 dans MATLAB (version 7), que je dois utiliser dans un autre programme. L'appel de sauvegarde n'écrira pas ceci en ASCII (non pris en charge). L'appel de full () sur ce monstre génère une erreur Mémoire saturée .
Comment l'exporter?

Était-ce utile?

La solution 3

Je l'ai enregistré sous forme de texte à l'aide de Java dans MATLAB. Code 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();

Ici, data est une très grande matrice creuse.

Autres conseils

Vous pouvez utiliser find pour obtenir l'index & amp; vecteurs de valeur:

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

Vous pouvez recréer des données à partir de data_dump avec spconvert, destiné à "importer du format externe de matrice fragmentée". (donc je suppose que c'est un bon format d'exportation):

data = spconvert( data_dump )

Vous pouvez enregistrer en ascii avec:

save -ascii data.txt data_dump

Mais cela vide les index en double, vous pouvez l'écrire plus facilement avec fopen / fprintf / fclose:

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

J'espère que cela vous aidera.

Enregistrez la matrice fragmentée dans un fichier .mat . Ensuite, dans l’autre programme, utilisez une bibliothèque appropriée pour lire le fichier .mat .

Par exemple, si l'autre programme est écrit en Python, vous pouvez utiliser la fonction scipy.io.mio.loadmat , qui prend en charge les tableaux fragmentés et vous fournit une matrice numpy fragmentée.

Avez-vous essayé de le partitionner?

Je veux dire, essayez d'appeler full () sur les 1000 premières lignes (ou 5000), puis répétez le processus si cela fonctionne.

Utilisez la fonction find pour obtenir les indices d'éléments non nuls ...

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

Si vous le souhaitez, vous pouvez utiliser ind2sub pour convertir les index linéaires en indices de ligne, de colonne.

Si vous devez recréer une matrice fragmentée dans matlab à partir d'indices + de valeurs, utilisez spconvert .

dlmwrite - Écriture de la matrice dans un fichier délimité par des caractères ASCII Syntaxe

dlmwrite (nom de fichier, M)

dlmwrite (nom du fichier, M, 'D')

dlmwrite (nom du fichier, M, 'D', R, C)

dlmwrite (nom du fichier, M, 'attrib1', valeur1, 'attrib2', valeur2, ...)

dlmwrite (nom du fichier, M, '-append')

dlmwrite (nom du fichier, M, '-append', liste des valeurs d'attributs)

S'il s'agit en réalité d'un accord ponctuel, alors je voudrais simplement parcourir la matrice et écrire la matrice dans un fichier ASCII par force brutale, ou bien utiliser @ La suggestion de Veynom et appelle full () sur un sous-ensemble de lignes. Cela peut prendre un certain temps, mais cela sera probablement plus rapide que d’apprendre à lire un fichier .mat en dehors de l’environnement MATLAB.

Si c'est quelque chose que vous devez faire de manière récurrente, alors je prendrais @ Conseils de Vebjorn et utilisation d'une bibliothèque pour lire le fichier .mat.

Utilisez ce script: msm_to_mm.m , écrit une matrice fragmentée MATLAB dans un fichier MatrixMarket.

Et cela thread peut également être utile.

scroll top