2017-07-20 7 views
1

A = [100 -0.1 0]; B = [30 0.2 -2]; t1 = 'テキスト1'; T2 =テキスト2'MATLAB fprintf指数の桁数を増やす

ファイルに保存された出力は、私が(読みやすくするために複数の行にまたがって)一緒に 『ワンライナー』を置くこと

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

答えて

2

のようになりますように、関数fprintfを使用する方法配列、単一の数値書式、および区切り文字を受け取り、目的の文字列を返します。そして、あなたは機能の両方で動作するでしょうが、私は、+フラグを好む、先頭の空白スペースフラグを見つけながら:

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

関連する問題