2013-06-30 30 views

Trả lời

5

Theo tài liệu của fprintfsprintf

Chuyển đổi số chỉ in thành phần thực của số phức.

Vì vậy, cho một giá trị phức tạp z bạn có thể sử dụng

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

ví dụ

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

Bạn có thể bọc nó trong một chức năng ẩn danh để làm cho nó dễ dàng như là một chuỗi

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

rồi

>> zprintf(2+3i) 

ans = 

2.000000 + 3.000000i 
1

Tôi không biết nếu có một cách dễ dàng, nhưng bạn có thể viết chức năng của riêng bạn định dạng (cách cứng):

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 

Giải pháp này bị một số lỗi, (không xử lý% 2d ,% 3f) nhưng bạn có ý tưởng chung.

Dưới đây là kết quả:

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

Địa chỉ các phần thực và phần ảo riêng biệt:

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

hoặc chuyển sang chuỗi đầu tiên với num2str()

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

Tôi sợ bạn có thể đúng. Tôi sẽ xem liệu có ai khác có ý tưởng khác không. – Jim