我的代码是这样的
a= [2 4 5 8 6 7 88 9]
b= [12.8 41.3 13.7]
c= [16 18 20 10.1 17.5 49.5]
fprintf(out_file,'%d %d %d %d %d %d %d %d %f %f %f %d %d %d %f %f %f',a,b,c)
是否可以将转换(%d....%f
)用较短的形式写在fprintf
中,而不是重复多次?
或者我可以使用其他命令将其写入文件吗?
答案 0 :(得分:5)
此答案假设您不需要尾随的十进制零。也就是说,[4 4.1]
应该打印为4 4.1
,而不是4 4.10000
或4.00000 4.10000
。
让我们
a = [2 4 5 8 6 7 88 9];
b = [12.8 41.3 13.7];
c = [16 18 20 10.1 17.5 49.123456789]; % example with 9 decimal figures
您可以使用repmat
和strjoin
动态构建格式字符串。另外,您可以使用format specifier %g
,它会自动打印不带小数的整数值:
fprintf(strjoin([repmat({'%g'},1,numel(a)+numel(b)+numel(c))]),a,b,c)
给予
2 4 5 8 6 7 88 9 12.8 41.3 13.7 16 18 20 10.1 17.5 49.1235
如果您需要指定许多有效数字,请避免尾随十进制零:
fprintf(strjoin([repmat({'%.8g'},1,numel(a)+numel(b)+numel(c))]),a,b,c)
给予
2 4 5 8 6 7 88 9 12.8 41.3 13.7 16 18 20 10.1 17.5 49.123457
如果可以使用尾随空格,则不需要重复创建格式字符串,因为fprintf
可以针对所有输入自动回收:< / p>
fprintf('%.8g ',a,b,c)
给予
2 4 5 8 6 7 88 9 12.8 41.3 13.7 16 18 20 10.1 17.5 49.123457
答案 1 :(得分:3)
% Input.
a = [2 4 5 8 6 7 88 9];
b = [12.8 41.3 13.7];
c = [16 18 20 10.1 17.5 49.5];
% Concatenate inputs.
x = [a b c];
% Find integer values.
intidx = (floor(x) == x);
% Set format string.
formatstring = char((intidx.') * '%d ' + (not(intidx).') * '%f ');
formatstring = reshape(formatstring.', 1, numel(formatstring));
% Output.
sprintf(formatstring, x)
答案 2 :(得分:1)
@HansHirse的answer非常好。另一种使用repmat
的方法如下。可以稍微压缩一下代码,但保留其当前形式以供访问。
**替代方法:** repmat
a= [2 4 5 8 6 7 88 9];
b= [12.8 41.3 13.7];
c= [16 18 20 10.1 17.5 49.5];
fmtInt = '%d'; % format for integers
fmtFloat = '%f'; % format for floating point
fmtA = [repmat([fmtInt ' '],1,length(a)-1) fmtInt]
fmtB = [repmat([fmtFloat ' '],1,length(b)-1) fmtFloat]
fmtC = [repmat([fmtFloat ' '],1,length(c)-1) fmtFloat]
fmtstr = [fmtA ' ' fmtB ' ' fmtC] % desired format string
% Can call fprintf() or sprintf() as required using format string
答案 3 :(得分:1)
您可以使用cellfun
:
cellfun ...
( ...
@(f,v) fprintf(outfile, f, v), ...
{'%d ', '%f ', '%d ', '%f '}, ...
{a, b, c(1:3), c(4:6)}, ...
'UniformOutput' , false ...
);
您还可以使用循环:
fmt = {'%d ', '%f ', '%d ', '%f '; a, b, c(1:3), c(4:6)};
for f = fmt;
fprintf(outfile, f{:});
end