如何在Matlab中使用fprintf简短地编写多个变量?

时间:2019-03-08 10:21:59

标签: matlab printf

我的代码是这样的

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中,而不是重复多次?

或者我可以使用其他命令将其写入文件吗?

4 个答案:

答案 0 :(得分:5)

此答案假设您不需要尾随的十进制零。也就是说,[4 4.1]应该打印为4 4.1,而不是4 4.100004.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
  • 您可以使用repmatstrjoin 动态构建格式字符串。另外,您可以使用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