我在matlab中有一段代码可以将固定点矩阵写入文本文件。矩阵B的一个元素必须在文本的一行中。 'binary.txt'文件的每一行将包含一个B元素。令r1,r2,...,r100为矩阵B的行。假设B的第(i,j)个元素是x及其二进制表示为1101110111011110.然后在'binary.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,'%s\n',cval.bin); % write binary value to the file.
end
end
fclose(fid);
代码的文件写入部分很慢。如何快速编写文件?
答案 0 :(得分:2)
如果我正确理解了这个问题,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, '%s\n', B.bin);
fclose(fid);
请注意,在同时写入所有字符串之前,我必须转置矩阵B
。这是因为当我们将所有字符串收集到以逗号分隔的列表中时,这是以 column-major 顺序完成的。您的代码是以 row-major 顺序编写字符串,因此如果您想以行主顺序处理事物,则需要在开始处理数据之前转置矩阵。
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, '%s\n', B.bin);
fclose(fid);
我得到了这个文本文件:
1100011111111010
0101110110010110
1100001101110000
1100011110000101