通过 sprintf() 和 fprintf() 的 Matlab ShortEng 数字格式?

Posted

技术标签:

【中文标题】通过 sprintf() 和 fprintf() 的 Matlab ShortEng 数字格式?【英文标题】:Matlab ShortEng number format via sprintf() and fprintf()? 【发布时间】:2016-02-10 10:25:20 【问题描述】:

我喜欢在交互式命令行窗口中使用 MATLAB 的 shortEng 表示法:

>> a = 123e-12;
>> disp(a);

   1.2300e-10       % Scientific notation. Urgh!

>> format shortEng;
>> disp(a);

   123.0000e-012    % Engineering notation! :-D

但我想使用 fprintf:

>> format shortEng;
>> fprintf('%0.3e', a); 
1.2300e-10          % Scientific. Urgh!

如何使用 MATLAB Format Operators 以工程格式使用 fprintf 或 sprintf 打印值?

我知道我可以编写自己的函数来将值格式化为字符串,但我正在寻找 MATLAB 中已经内置的东西。

注意:“工程”符号与“科学”符号的不同之处在于指数始终是 3 的倍数。

>> fprintf('%0.3e', a);    % This is Scientific notation.
1.230000e-10

【问题讨论】:

好像没有内置函数来指定fprintf 输出到“工程”模式...你必须使用自己的函数 【参考方案1】:

没有办法直接使用fprintf 格式说明符来获取您需要的格式。一种解决方法是使用disp 的输出作为要打印的字符串。但是disp 不返回字符串,它直接写入标准输出。那么,该怎么做呢?

这就是evalc(带有捕获输出的评估)来救援的地方:

%// Create helper function
sdisp = @(x) strtrim(evalc(sprintf('disp(%g)', x)));

%// Test helper function
format ShortEng;
a = 123e-12;
fprintf(1, 'Test: %s', sdisp(a));

当然,这是一种解决方法,由于辅助函数的输入未经测试,因此可能会以多种方式适得其反。但它说明了一个观点,并且是被辱骂的eval 函数族实际上是不可替代的少数情况之一。

【讨论】:

足够接近了。相当简洁。谢谢【参考方案2】:

您可以使用以下实用程序:

http://www.people.fas.harvard.edu/~arcrock/lib118/numutil/unpacknum.m

这也会根据给定的数字N解包数字,并确保指数是N的倍数。通过输入 N=3,您就有了工程符号。

更详细地说,unpacknum 有 3 个参数:数字 x、基数(10,如果你想要工程符号)和值 N3,如果你想要Engineering Notation),它返回一对(f,e),你可以在fprintf()中使用。

查看unpacknum 帮助以获取快速示例。

【讨论】:

链接似乎已失效。【参考方案3】:

该函数将数值转换为工程符号的字符串:

function sNum = engn(value)
exp= floor(log10(abs(value)));
if ( (exp < 3) && (exp >=0) ) 
    exp = 0; % Display without exponent
else
    while (mod(exp, 3))
        exp= exp - 1;
    end
end
frac=value/(10^exp); % Adjust fraction to exponent
if (exp == 0)
    sNum = sprintf('%+8.5G', frac);
else
    sNum = sprintf('%+8.5GE%+.2d', frac, exp);
end
end

您可以根据自己的喜好微调格式。与 fprintf 结合使用很简单:

fprintf('%s\t%s\n', engn(543210.123), engn(-0.0000567)) % +543.21E+03  -56.7E-06
fprintf('%s\t%s\n', engn(-321.123), engn(876543210)) % -321.12   +876.54E+06

【讨论】:

【参考方案4】:

您可以使用发布到 MATLAB 文件交换的以下实用程序: num2eng

它提供了对输出字符串格式和完整输入检查的广泛控制,因此比 user2271770 建议的更简单的 evalc 方法更灵活且不易出错。

如果您愿意,它还可以使用 SI 前缀而不是工程符号来输出字符串。

【讨论】:

以上是关于通过 sprintf() 和 fprintf() 的 Matlab ShortEng 数字格式?的主要内容,如果未能解决你的问题,请参考以下文章

printf, fprintf, sprintf, snprintf, vprintf, vfprintf, vsprintf, vsnprintf - 输出格式转换

stderr 和stdout

fprintf和printf有啥区别吗?

printfsprintf和fprintf

disp

C语言 sprintf 函数