web-dev-qa-db-fra.com

Quel est le moyen le plus rapide d'écrire une matrice dans un fichier texte dans Octave?

J'ai une grande matrice (2e6 x 3) que je dois écrire dans un fichier texte.

dlmwrite prend environ 230 secondes pour réaliser cette tâche.

D'après votre expérience, quel est le moyen le plus rapide d'écrire une grande matrice dans un fichier texte?

10
Steven

Ce qui suit s’applique à MATLAB, mais je vous suggère de l’essayer dans Octave. Tout d’abord, si vous le pouvez - transposez la matrice. Voici des exemples utilisant fprintf et csvwrite (essentiellement dlmwrite)

A = Rand(3, 1e6);
tic;
fid = fopen('data.txt', 'w+');
for i=1:size(A, 1)
    fprintf(fid, '%f ', A(i,:));
    fprintf(fid, '\n');
end
fclose(fid);
toc

tic;
csvwrite('data.txt', A);
toc;

Elapsed time is 1.311512 seconds.
Elapsed time is 2.487737 seconds.

Si ce n'est pas transposé, cela prendra des siècles. Par défaut, fprintf vide le tampon après chaque appel . Vous pouvez essayer d'utiliser W au lieu de w pour ouvrir le fichier, mais cela n'améliore pas trop la situation.

13
angainor

Avez-vous essayé cela? Je ne suis pas sûr de sa vitesse par rapport à dlmwrite.

a = [1 2;3 4];
save temp.txt a;
7
Anant Gupta

Ayant une variable data, vous pouvez l'enregistrer au format text avec des valeurs séparées par des espaces (y compris un en-tête):

save out.txt data

L'en-tête peut être simplement supprimé à l'aide de la commande Unix de base tail p. Ex. (sur tout Linux/Mac OS):

tail -n +6 out.txt > file.csv
1
Tombart

Utilisez ceci dans Matlab:

 save -ascii output.txt variableName

Utilisez ceci dans Octave:

 save hello1.m variableName -ascii 
0
Akash Kandpal

Théoriquement, selon ce que @angainor a dit, on peut même améliorer les performances

for i=1:size(A, 1)
   fprintf(fid, '%f ', A(i,:));
   fprintf(fid, '\n');
end

en morceaux pour éviter le vidage inutile du tampon, c.-à-d. 

1. coverting (in memory) numbers->string + introduction of termination characters '\n' 
   (for say K matrix rows)
2. writing of the obtained string to file through fscanf.

Faut essayer ...

0
Acorbe