2013-06-30 9 views

Odpowiedz

5

Według dokumentacji fprintf i sprintf

Konwersja liczbowa wyświetla tylko rzeczywisty składnik liczb zespolonych.

Tak na zespoloną wartość z można użyć tego

sprintf('%f + %fi\n', z, z/1i) 

np

>> z=2+3i; 
>> sprintf('%f + %fi\n', z, z/1i) 
2.000000 + 3.000000i 

można zawinąć go w anonimowej funkcji, aby ją łatwo jako ciąg

zprintf = @(z) sprintf('%f + %fi', z, z/1i) 

następnie

>> zprintf(2+3i) 

ans = 

2.000000 + 3.000000i 
1

Nie wiem, czy istnieje prosty sposób, ale można napisać własną funkcję Format (hard way):

function mainFunction() 
    st = sprintfe('%d is imaginary, but %d is real!',1+3i,5); 
    disp(st); 

    st = sprintfe('%f + %f = %f',i,3,3+i); 
    disp(st); 
end 

function stOut = sprintfe(st,varargin) %Converts complex numbers. 
    for i=1:numel(varargin) 
     places = strfind(st,'%'); 
     currentVar = varargin{i}; 
     if isnumeric(currentVar) && abs(imag(currentVar))> eps 
      index = places(i); 
      formatSpecifier = st(index:index+1); 
      varargin{i} = fc(currentVar,formatSpecifier); 
      st(index+1) = 's'; 
     end 
    end 
    stOut = sprintf(st,varargin{:}); 
end 

function st = fc(x,formatSpecifier) 
    st = sprintf([formatSpecifier '+' formatSpecifier 'i'],real(x),imag(x)); 
end 

To rozwiązanie napotyka na pewne błędy, (nie obsługuje% 2d ,% 3f), ale masz ogólny pomysł.

Oto wyniki:

>> mainFuncio 
1+3i is imaginary, but 5 is real! 
0.000000+1.000000i + 3.000000 = 3.000000+1.000000i 
3

Adres rzeczywiste i urojone części oddzielnie:

x = -sqrt(-2)+2; 
fprintf('%7.4f%+7.4fi\n',real(x),imag(x)) 

lub przekonwertować ciąg najpierw num2str()

num2str(x,'%7.4f') 
+0

Obawiam się, że możesz mieć rację. Zamierzam sprawdzić, czy ktoś jeszcze ma inny pomysł. – Jim

Powiązane problemy