通过 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
,如果你想要工程符号)和值 N(3
,如果你想要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 - 输出格式转换