2017-07-20 27 views
1

如果我们有 A = [100 -0.1 0]; B = [30 0.2 -2]; t1 ='文字1'; T2 =文本2'MATLAB fprintf增加指数位数

如何使用fprintf中,使保存在文件输出将看起来像

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

回答

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 
+0

@BERKO注:我添加的附加信息与您以前版本的一个工作。 – TroyHaskin