Matlab ShortEng number format via sprintf() and fprintf()?

最后都变了- 提交于 2019-12-23 09:42:21

问题


I like using MATLAB's shortEng notation in the interactive Command Window:

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

   1.2300e-10       % Scientific notation. Urgh!

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

   123.0000e-012    % Engineering notation! :-D

But I want to use fprintf:

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

How do I print values with fprintf or sprintf with Engineering formatting using the MATLAB Format Operators?

I know I could write my own function to format the values into strings, but I'm looking for something already built into MATLAB.

NOTE: "Engineering" notation differs from "Scientific" in that the exponent is always a multiple of 3.

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

回答1:


There is no way to use directly fprintf format specifier for the format you require. A way around is to use the output of disp as a string to be printed. But disp doesn't return a string, it writes directly to the standard output. So, how to do this?

Here's where evalc (eval with capture of output) comes to the rescue:

%// 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));

This is a workaround, of course, and can backfire in multiple ways because of the untested inputs of the helper functions. But it illustrates a point, and is one of the rare occasions where the reviled eval function family is actually irreplaceable.




回答2:


You can use the following utility:

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

This will unpack the number also according to a given number N and makes sure that the exponent will be a multiple of N. By putting N=3 you have the Engineering Notation.

More into detail, unpacknum takes 3 arguments: the number x, the base (10 if you want Engineering Notation) and the value N (3 if you want Engineering Notation) and it returns the couple (f,e) which you can use in fprintf().

Check the unpacknum help for a quick example.




回答3:


This function converts a value into a string in engineering notation:

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

You can finetune the format to your liking. Usage in combination with fprintf is easy enough:

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


来源:https://stackoverflow.com/questions/35312572/matlab-shorteng-number-format-via-sprintf-and-fprintf

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!