>我在 matlab 中有一段代码可以将定点矩阵写入文本文件。矩阵 B 的一个元素必须在文本的一行中。"二进制.txt"文件的每一行将包含一个 B 元素。设 r1,r2,...,r100 是矩阵 B 的行。假设 B 的第 (i,j) 个元素是 x,其二进制表示是1101110111011110。然后在"二进制.txt"的第 (i*N + j) 行中,必须写入字符串1101110111011110。基本上将 B 的行堆叠成一个长行向量,然后将生成的行向量转置(到列向量中)并将该列向量写入文件。
M = 100,N = 10000;
A = rand(M,N);
B = fi(A,1,16,15);
fid = fopen('binary.txt','w');
for i = 1:M
for j = 1:N
cval = B(i,j);
fprintf(fid,'%sn',cval.bin); % write binary value to the file.
end
end
fclose(fid);
代码的文件写入部分很慢。如何使文件写入速度更快?
正确理解这个问题,B
是一个结构矩阵,其中每个结构都有一个名为 bin
的字段,其中包含一个 16 个字符的 0 和 1 字符串。 您正在尝试将此结构中的每个字符串作为单独的行写入输出文件中。
号分隔的列表,并同时写入所有字符串,每行一个字符串。
请改为执行以下操作:
% // Your code
M = 100,N = 10000;
A = rand(M,N);
B = fi(A,1,16,15);
fid = fopen('binary.txt','w');
%// New code
B = B.';
fprintf(fid, '%sn', B.bin);
fclose(fid);
请注意,在同时写入所有字符串之前,我必须转置矩阵B
。 原因是因为当我们将所有字符串收集到逗号分隔的列表中时,这是按列主顺序完成的。 您的代码按行优先顺序编写字符串,因此,如果要按行优先顺序处理内容,则需要在开始处理数据之前转置矩阵。
例
clear B
B(1,1) = struct('bin', char(48 + randi(2, 1, 16) - 1));
B(1,2) = struct('bin', char(48 + randi(2, 1, 16) - 1));
B(2,1) = struct('bin', char(48 + randi(2, 1, 16) - 1));
B(2,2) = struct('bin', char(48 + randi(2, 1, 16) - 1));
fid = fopen('binary.txt', 'w');
fprintf(fid, '%sn', B.bin);
fclose(fid);
我为文本文件得到这个:
1100011111111010
0101110110010110
1100001101110000
1100011110000101