13

我有一个大矩阵(2e6 x 3),我必须将其写入文本文件。

dlmwrite 大约需要 230 秒才能完成这项任务。

根据您的经验,将大型矩阵写入文本文件的最快方法是什么?

4

6 回答 6

17

以下适用于 MATLAB,但我建议您在 Octave 中尝试。首先,如果可以的话 - 转置矩阵。以下是使用fprintfand csvwrite(本质上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.

如果不转置,确实需要很长时间。默认情况下,fprintf每次调用后刷新缓冲区。您可以尝试使用W而不是w打开文件,但这并没有太大改善这里的情况。

于 2012-10-17T10:44:25.593 回答
7

你试过这个吗?与 dlmwrite 相比,我不确定它的速度。

a = [1 2;3 4];
save temp.txt a;
于 2013-08-20T19:13:06.667 回答
2

拥有一个变量data,您可以将其保存为text具有空格分隔值的格式(包括标题):

save out.txt data

可以使用基本的 Unix 命令简单地删除标头,tail例如(在任何 Linux/Mac OS 上):

tail -n +6 out.txt > file.csv
于 2015-12-08T13:05:24.907 回答
0

从理论上讲,根据@angainor 所说,甚至可以以某种方式提高性能包装

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

在块中避免无用的缓冲区刷新,iedoing

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.

应该试试。。

于 2012-10-17T14:12:59.800 回答
0

在 Matlab 中使用:

 save -ascii output.txt variableName

在 Octave 中使用它:

 save hello1.m variableName -ascii 
于 2018-01-14T12:33:21.230 回答
0

在我的系统中

A = rand(3, 1e6);

# Method with fprintf
tic;
fid = fopen('data1.txt', 'w+');
for i=1:size(A, 1)
    fprintf(fid, '%f ', A(i,:));
    fprintf(fid, '\n');
end
fclose(fid);
toc

# Method with sprintf
tic;
s = "";
for i=1:size(A, 1)
    s = strcat( s, sprintf('%f ', A(i,:)) );
    s = strcat( s, sprintf('\n') );
end
fid = fopen('data2.txt', 'w+');
    fprintf(fid, '%s\n', s);
fclose(fid);
toc

# Method with save
tic;
save 'data3.txt' A;
toc;

return;  # Commented when the size is <= 1e5

# Method with csvwrite
tic;
csvwrite('data4.txt', A);
toc;

>> Elapsed time is 5.36293 seconds.
Elapsed time is 6.43252 seconds.
Elapsed time is 6.09889 seconds.

因为csvwrite它比其他的慢 10 倍,所以我只尝试了 size = 10^-5。在这种情况下,

>> Elapsed time is 0.541885 seconds.
Elapsed time is 0.657595 seconds.
Elapsed time is 0.576796 seconds.
Elapsed time is 4.24433 seconds.

我的结论是:

  1. 各种方法之间的速度比较很大程度上取决于系统。然后,您将不得不自己尝试。

  2. Acorbe的提议没有达到他的预期。

于 2019-09-19T06:26:34.017 回答