2016-02-10 2 views
5

Ich mag mit shortEng Notation in dem interaktiven Befehlsfenster des MATLAB:Matlab ShortEng Zahlenformat über sprintf() und fprintf()?

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

    1.2300e-10  % Scientific notation. Urgh! 

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

    123.0000e-012 % Engineering notation! :-D 

Aber ich will fprintf verwenden:

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

Wie kann ich Werte mit fprintf oder sprintf mit Engineering-Formatierung mit der MATLAB drucken Format Operators?

Ich weiß, dass ich meine eigene Funktion schreiben könnte, um die Werte in Zeichenfolgen zu formatieren, aber ich suche nach etwas, das bereits in MATLAB eingebaut ist.

HINWEIS: "Engineering" Notation unterscheidet sich von "Scientific", dass der Exponent ist immer ein Vielfaches von 3.

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

sieht aus wie es nicht in Funktion bauen zu spezifizieren 'fprintf' Ausgabe„Engineering“-Modus ... Sie haben eine eigene Funktion –

Antwort

3

Es gibt keine Möglichkeit, den Formatbezeichner fprintf für das gewünschte Format direkt zu verwenden. Eine Möglichkeit besteht darin, die Ausgabe disp als zu druckende Zeichenfolge zu verwenden. Aber disp gibt keine Zeichenfolge zurück, es schreibt direkt auf die Standardausgabe. Also, wie geht das?

Hier ist, wo evalc (eval mit Erfassung der Ausgabe) zur Rettung kommt:

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

Dies ist eine Abhilfe, natürlich, und kann wegen der nicht getesteten Eingänge der Helferfunktionen auf vielfältige Weise nach hinten losgehen. Aber es veranschaulicht einen Punkt und ist eine der seltenen Gelegenheiten, in denen die geschmähte eval Funktionsfamilie tatsächlich unersetzlich ist.

+0

Nah genug. Ziemlich knapp. Vielen Dank –

2

Sie das folgende Dienstprogramm verwenden können:

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

Diese wird die Zahl auch entsprechend einer gegebenen Nummer N entpacken und stellt sicher, dass der Exponent ein Vielfaches von N ist. Mit N = 3 haben Sie die Engineering Notation.

Mehr ins Detail, nimmt unpacknum 3 Argumente: die Anzahl x, die Basis (10 wenn Sie wollen Ingenieur Notation) und den Wert N (3 wenn Sie wollen Ingenieur Notation) und es gibt das Paar (f, e), die Sie in fprintf() verwenden können.

Überprüfen Sie die unpacknum Hilfe für ein schnelles Beispiel.

+0

die Verbindung zu verwenden, erscheint tot sein. – Grebu

+0

@Grebu danke! Link aktualisiert – Alessiox

0

Diese Funktion konvertiert einen Wert in einen String in technischen 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 

Sie das Format nach Ihren Wünschen finetune können. Die Verwendung in Kombination mit fprintf ist einfach genug:

fprintf('%s\t%s\n', engn(.123), engn(-0.0000567)) % +543.21E+03 -56.7E-06 
fprintf('%s\t%s\n', engn(-321.123), engn()) % -321.12 +876.54E+06