我喜欢在交互式命令窗口中使用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中的东西。
注意:"工程"符号与" Scientific"因为指数总是3的倍数。
>> fprintf('%0.3e', a); % This is Scientific notation.
1.230000e-10
答案 0 :(得分:3)
无法直接使用fprintf
格式说明符来表示您需要的格式。一种方法是使用disp
的输出作为要打印的字符串。但是disp
没有返回字符串,它直接写入标准输出。那么,怎么做呢?
这里有evalc
(获得输出的eval)来救援:
%// 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
函数族实际上不可替代的极少数情况之一。
答案 1 :(得分:2)
您可以使用以下实用程序:
http://www.people.fas.harvard.edu/~arcrock/lib118/numutil/unpacknum.m
这将根据给定的数字 N 解压数字,并确保指数为 N 的倍数。通过输入 N = 3 ,您就拥有了工程符号。
详细信息,unpacknum
有3个参数:数字x
,基数(10
,如果你想要工程符号)和值 N ( 3
如果你想要工程符号),它会返回你可以在f
中使用的情侣(e
,fprintf()
)。
查看unpacknum
帮助以获取快速示例。
答案 2 :(得分:1)
此函数将值转换为工程符号中的字符串:
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
答案 3 :(得分:1)
您可以使用以下实用程序发布到MATLAB文件交换中: num2eng
它提供了对输出字符串格式和完整输入检查的广泛控制,因此与user2271770建议的更简单的撤消方法相比,它更加灵活且不易出错。
如果愿意,它还可以使用SI前缀而不是工程符号来输出字符串。