2016-02-10 7 views
5

Mi piace usare shortEng la notazione di MATLAB nella finestra di comando interattivo:Matlab ShortEng numero formato tramite sprintf() e fprintf()?

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

    1.2300e-10  % Scientific notation. Urgh! 

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

    123.0000e-012 % Engineering notation! :-D 

Ma voglio usare fprintf:

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

Come faccio a stampare i valori con fprintf o sprintf con Engineering formattazione utilizzando MATLAB Format Operators?

So che potrei scrivere la mia funzione per formattare i valori in stringhe, ma sto cercando qualcosa già incorporato in MATLAB.

NOTA: "Engineering" notazione è diverso da "Scientific", in quanto l'esponente è sempre un multiplo di 3.

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

sembra non ci sono costruite in funzione per specificare 'uscita fprintf' in modalità "Engineering" ... Dovete usare la propria funzione –

risposta

3

Non è possibile utilizzare direttamente l'identificatore di formato fprintf per il formato richiesto. Un modo per aggirare è utilizzare l'output di disp come stringa da stampare. Ma disp non restituisce una stringa, scrive direttamente sullo standard output. Quindi, come si fa?

Ecco dove evalc (eval con cattura di uscita) viene in soccorso:

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

Si tratta di una soluzione, naturalmente, e può ritorcersi contro in diversi modi a causa degli ingressi non testate delle funzioni di supporto. Ma illustra un punto ed è una delle rare occasioni in cui la famiglia di funzioni eval insultata è effettivamente insostituibile.

+0

Abbastanza vicino. Abbastanza conciso. Grazie –

2

È possibile utilizzare il seguente programma di utilità:

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

Questo decomprimerà il numero anche in base a un numero dato N e si assicurerà che l'esponente sia un multiplo di N. Inserendo N = 3 si ha la notazione tecnica.

Più nel dettaglio, unpacknum prende 3 argomenti: il numero x, la base (10 se si vuole della notazione scientifica) e il valore N (3 se si vuole della notazione scientifica) e restituisce la coppia (f, e) che è possibile utilizzare in fprintf().

Controllare la guida unpacknum per un rapido esempio.

+0

appare il link essere morto – Grebu

+0

@Grebu grazie! Link aggiornato. – Alessiox

0

Questa funzione converte un valore in una stringa in notazione tecnica:

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 

È possibile perfezionare il formato a proprio piacimento. Utilizzo in combinazione con fprintf è abbastanza facile:

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