result 'output1' 'output2'
result1 [1.0000] [0.0182]
counter [ 2] [ 0]
percentage [ 4] [ 7]
我有一个存储在表格中的输出(T
),我想在一个文本文件中打印所有200个循环结果。我已经尝试使用可写功能并且总是有问题,输出会覆盖以前的输出。
fid = fopen(filename,'w');
for i = 1:200
writetable(T,'finalresult.txt','Delimiter','\t','WriteRowNames',true);
end
fclose(fid);
输出应该是这样的:
result 'output1' 'output2'
result1 [1.0000] [0.0182]
counter [ 2] [ 0]
percentage [ 4] [ 7]
result 'output1' 'output2'
result1 [0.0182] [1.0000]
counter [ 3] [ 0]
percentage [ 4] [ 7]
所有输出i = 200 的等等
答案 0 :(得分:1)
根据MATLAB的documentation for writetable
,这是默认行为。
- 如果
filename
是现有文本文件的名称,则writetable
会覆盖该文件。
这为您提供了两个选项:创建自己的导出例程或使用所需行为重载MATLAB。让我们看看后者。
警告:修改默认的MATLAB行为可能会导致意外的结果和错误。注意只修改MATLAB默认文件的副本,以便在完成后恢复MATLAB的状态。
幸运的是,table
及其相关方法的源代码目前已打开,因此您可以使用open
来阅读它们并了解它们的行为。我们看到writetable
是未记录的table.write
的瘦包装器,它解析输入参数并确定是否写入文本文件或电子表格。对于文本案例,MATLAB调用writeTextFile
函数(再次,未记录)来处理将表数据写入文本文件。
如果查看line 25
,您将看到MATLAB打开文件进行编写,如下所示:
% Open the file for writing
[fid,errmsg] = fopen(file,'Wt'); % text mode: CRLF -> LF
根据fopen
的文档,这将打开写入文件('W'
),该文件将丢弃任何现有内容。保存writeTextFile
的副本并更改fopen
调用以附加数据而不是覆盖它应该会产生所需的行为。
% Open the file for writing
fprintf('!!! Using overloaded writeTextFile D:\n%s\n', mfilename('fullpath'));
[fid,errmsg] = fopen(file,'At'); % text mode: CRLF -> LF
根据MATLAB的Function Precedence Order,Private或Object函数优先于MATLAB路径中的函数,因此我们需要将此修改后的文件放在与原始函数相同的位置。您可以使用which -all
找到此位置:
>> which writeTextFile -all
C:\excaza\writeTextFile.m
C:\Program Files\MATLAB\R2016b\toolbox\matlab\datatypes\@tabular\writeTextFile.m % tabular method
您应该看到保存的副本和MATLAB的内置版本。您现在应该重命名内置函数(例如writeTextFile_builtin.m
)并将修改后的文件版本复制到该文件夹中。运行clear all
一次以清除该函数的任何内存缓存版本。
我们现在可以测试一下我们是否达到了预期的结果:
filename = 'test.txt';
var1 = 1;
var2 = 2;
T1 = table(var1, 'RowNames', {'hi'});
T2 = table(var2, 'RowNames', {'hi'});
writetable(T1, filename)
writetable(T2, filename)
返回以下test.txt
:
Row var1
hi 1
Row var2
hi 2
完成后,请务必还原对内置所做的更改。
答案 1 :(得分:0)
a1=0.1;
a2=0.2;
opt =fopen('test.txt','a');
for i=1: size(t,1)
j=1;
if(i==1)
s=strcat('\n','result','\t',t(i,j),'\t',t(i,j+1),'\n');
s=s{1};
end
if (i==2)
a1=t{i,j};
a2=t{i,j+1};
s=strcat('\n','result1','\t',num2str(a1),'\t',num2str(a2),'\n');
end
if (i==3)
a1=t{i,j};
a2=t{i,j+1};
s=strcat('\n','counter','\t',num2str(a1),'\t',num2str(a2),'\n');
end
if (i==4)
a1=t{i,j};
a2=t{i,j+1};
s=strcat('\n','counter1','\t',num2str(a1),'\t',num2str(a2),'\n');
end
if (i==5)
a1=t{i,j};
a2=t{i,j+1};
s=strcat('\n','percentage','\t',num2str(s1),'\t',num2str(s1),'\n');
end
fprintf(opt,s);
end
输出将是这样的
result output1 output2
result1 1.0000 0.0182
counter 1 1
counter1 0 0
percentage 0 0
我在没有做任何功能修改的情况下解决了它。 @Brian感谢您的回答和明确的解释。