2016-02-10 5 views
5

Мне нравится использовать shortEng нотации MATLAB в интерактивном окне команд:Matlab ShortEng формат номера через sprintf() и fprintf()?

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

    1.2300e-10  % Scientific notation. Urgh! 

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

    123.0000e-012 % Engineering notation! :-D 

Но я хочу использовать fprintf:

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

Как напечатать значения с fprintf или Sprintf с Engineering форматирования с использованием MATLAB Format Operators?

Я знаю, что могу написать свою собственную функцию для форматирования значений в строки, но я ищу что-то уже встроенное в MATLAB.

Примечание: "Engineering" обозначение отличается от "научной" в том, что показатель всегда кратна 3.

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

выглядит там не встраивать функции указать 'выход fprintf' в режим«Engineering»... Вы должны использовать свою собственную функцию –

ответ

3

Невозможно напрямую использовать спецификатор формата fprintf для требуемого формата. Способ состоит в том, чтобы использовать вывод disp в качестве строки для печати. Но disp не возвращает строку, она напрямую записывается на стандартный вывод. Итак, как это сделать?

Вот где evalc (Eval с захватом производства) приходит на помощь:

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

Это временное решение, конечно же, и может иметь неприятные последствия несколькими способами из-за непроверенных входам вспомогательных функций. Но это иллюстрирует точку и является одним из редких случаев, когда оскорбленное семейство функций eval фактически незаменимо.

+0

достаточно близко. Довольно лаконично. благодаря –

2

Вы можете использовать следующую утилиту:

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

Это будет распечатывать номер также в соответствии с заданным номером N и удостоверяется, что показатель будет кратным N. Поместив N = 3, у вас есть технические обозначения.

Более подробно, unpacknum принимает 3 аргумента: число x, база (10, если вы хотите Engineering Notation) и значение N (3, если вы хотите Engineering Notation) и возвращает пару (f, e), которую вы можете использовать в fprintf().

Для получения более точной информации обратитесь к справочнику unpacknum.

+0

появится ссылка быть мертвым. – Grebu

+0

@Grebu спасибо! Ссылка обновлена. – Alessiox

0

Эта функция преобразует значение в строку в инженерной нотации:

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 

Вы можете точно настроить формат по своему вкусу. Использование в сочетании с fprintf достаточно легко:

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