MATLAB fprintf增加指数的位数

MATLAB fprintf增加指数的位数,matlab,formatting,printf,Matlab,Formatting,Printf,如果我们有 A=[100-0.10]; B=[30 0.2-2];t1='text 1';t2=文本2' 如何使用fprintf使保存在文件中的输出如下所示 100 -1.000E-0001 0.000E-0000 'text 1' 30 2.000E-0001 -2.000E-0000 'text 2' 我把一个“一行”放在一起(为了更好的可读性而分散在几行中),它采用数组、单个数字格式和分隔符,并返回所需的字符串。虽然您找到了前导空格标志,但我更喜欢+标志,尽管该函数将同时适用于以

如果我们有 A=[100-0.10]; B=[30 0.2-2];t1='text 1';t2=文本2'

如何使用fprintf使保存在文件中的输出如下所示

100 -1.000E-0001  0.000E-0000 'text 1' 
30   2.000E-0001 -2.000E-0000 'text 2'
我把一个“一行”放在一起(为了更好的可读性而分散在几行中),它采用数组、单个数字格式和分隔符,并返回所需的字符串。虽然您找到了前导空格标志,但我更喜欢
+
标志,尽管该函数将同时适用于以下两种情况:

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]);
运行此操作将产生:

>> foo
-1.0000E-0001  +0.0000E+0000
+2.0000E-0001  -2.0000E+0000
foo
正是脚本文件的名称。)


这里有一种更通用的方法,搜索指数格式,而不是假设它:

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));
输出

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

@BERKO注:我添加了一个扩展来处理您以前的一个修订版。