8

我有一个复数,我想使用 fprintf 命令将其输出为文本。我没有看到复数的格式规范。是否有捷径可寻?

使用定点格式规范仅输出实部。

4

3 回答 3

6

根据fprintfsprintf的文档

数值转换仅打印复数的实部。

因此,对于复杂的值z,您可以使用它

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

例如

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

您可以将其包装在匿名函数中以轻松将其作为字符串获取

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

然后

>> zprintf(2+3i)

ans =

2.000000 + 3.000000i
于 2013-07-01T08:36:59.033 回答
5

分别处理实部和虚部:

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

或先转换为字符串num2str()

num2str(x,'%7.4f')
于 2013-06-30T22:21:58.843 回答
1

我不知道是否有简单的方法,但是您可以编写自己的格式函数(困难的方法):

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

此解决方案存在一些错误(不处理 %2d,%3f),但您大致了解。

结果如下:

>> mainFuncio
1+3i is imaginary, but 5 is real!
0.000000+1.000000i + 3.000000 = 3.000000+1.000000i
于 2013-06-30T22:21:48.257 回答