【问题标题】:Specify maximum width of printed value in MATLAB在 MATLAB 中指定打印值的最大宽度
【发布时间】:2020-09-26 20:47:04
【问题描述】:

sprintf 和 fprintf 的字段宽度参数(例如,“sprintf('%nf',1234)”中的“n”)指定字段的最小宽度。这意味着将填充较短的数字,但在需要保持指定精度时,允许较长的数字超出指定的字段宽度。我正在寻找一种方法来指定 最大 字段宽度,以便宽度取代精度。

例如,我希望 1234.56、1234.56789 和 1.2345 的宽度为 8 个字符(包括小数点),因此分别打印为 1234.560、1234.567 和 1.234500。

这是一个类似的问题,但没有特定于 MATLAB 的解决方案 Specifying maximum printf field width for numbers (truncating if necessary)?

我觉得以前一定有人遇到过这个问题,但我找不到任何相关的东西。如果存在类似问题,请提供链接。谢谢

【问题讨论】:

    标签: matlab printf width truncate


    【解决方案1】:

    您可以使用floor(log10()) 来确定您有多少个非浮动数字:

    X    = [1234.56, 1234.56789, 1.2345]
    n    = 8 % number of total digits.
    % We create an array of string containing the format: 
    %[ '%.4f\n'
    %  '%.4f\n'
    %  '%.7f\n' ]
    form = strcat('%.',num2str(n-1-floor(real(log10(X))).'),'f\n')
    % We concatenate this array into one single string and we print the result:
    fprintf(reshape(form.',1,[]),X) 
    

    或者你可以使用 for 循环(使用相同的逻辑):

    for x = X
        form = strcat('%.',num2str(7-floor(real(log10(x)))),'f\n');
        fprintf(form,x)
    end
    

    我们得到:

    1234.5600
    1234.5679
    1.2345000
    

    编辑:

    我使用floor(log10()) 而不是ceil(log10()),因此如果数字是集合10^n (1,10,100...) 的一部分,则代码不会失败。

    现在这个 sn-p 可以处理负浮点数,因为我只取 log10 输出的实部。

    【讨论】:

    • 感谢您的解决方法!然而,我喜欢 fprintf 的一个特性是能够为每一行指定一个结构,而无需知道我实际需要多少个实例。有没有办法让您的解决方案具有相同级别的灵活性?例如, fprintf(fid,'%.8f%.8f%.8f%.8f\n,X) 将打印数组 X 的内容,四到一行,打印所需的行数(包括部分行) )。但是您的方法需要单独评估 X 的每个元素。是否可以进行修改以保留我的批处理格式?
    【解决方案2】:

    如果您不介意截断而不是舍入隐藏的数字,请尝试

    S = num2str( X(:), '%-10.9f');  % creates a left-justified character-array
    fprintf( '%s\n', string( S(:,1:7) ) )
    

    (需要检查 X 的值是否太大。)

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2019-05-30
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多