简体   繁体   中英

MATLAB fprintf Increase Number of Digits of Exponent

If we have A=[100 -0.1 0]; B=[30 0.2 -2]; t1='text 1'; t2=text 2'

how to use fprintf so that the output saved in a file will look like that

100 -1.000E-0001  0.000E-0000 'text 1' 
30   2.000E-0001 -2.000E-0000 'text 2'

I put together a "one-liner" (spread across several lines for better readability) that takes an array, a single number format, and a delimiter and returns the desired string. And while you found the leading blank-space flag, I prefer the + flag, though the function will work with both:

A=[-0.1 0];
B=[0.2 -2];

minLenExp  = 4;
extsprintf = @(num,fmt,delim) ...
    strjoin(cellfun(...
        @(toks)[toks{1},repmat('0',1,max([0,minLenExp-length(toks{2})])),toks{2}],...
        regexp(sprintf(fmt,num),'([+-\s][\.\d]+[eE][+-])(\d+)','tokens'),...
        'UniformOutput',false),delim);

Astr = extsprintf(A,'%+.4E','  ');
Bstr = extsprintf(B,'%+.4E','  ');

disp([Astr;Bstr]);

Running this yields:

>> foo
-1.0000E-0001  +0.0000E+0000
+2.0000E-0001  -2.0000E+0000

( foo is just what the script file is called.)


Here's a more general approach that searches for the exponential format instead of assuming it:

A=[100 -0.1 0].';
B=[30 0.2 -2];

extsprintf = @(fmt,arr) ...
    regexprep(...
        sprintf(fmt,arr),...
        regexprep(regexp(sprintf(fmt,arr),'([+-\s][\.\d]+[eE][+-]\d+)','match'),'([\+\.])','\\$1'),...
        cellfun(@(match)...
                cellfun(...
                    @(toks)[toks{1},repmat('0',1,max([0,minLenExp-length(toks{2})])),toks{2}],...
                    regexp(match,'([+-\s][\.\d]+[eE][+-])(\d+)','tokens'),...
                    'UniformOutput',false),...
                regexp(sprintf(fmt,arr),'([+-\s][\.\d]+[eE][+-]\d+)','match')));

fmt = '%3d  %+.4E  %+.4e';
disp(extsprintf(fmt,A));
disp(extsprintf(fmt,B));

Outputs

>> foo
100  -1.0000E-0001  +0.0000e+0000
 30  +2.0000E-0001  -2.0000e+0000

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM