phase函数和angle函数有什么区别

如题所述

phase 和 angle 在输入为单个标量数据时,没有差别,二者都是用 atan2 函数来求输入数据的四象限辐角。但是对于向量或矩阵数据输入时,二者差别非常大。

1. phase 只支持标量和一维(行、列)向量输入,不支持二维或高维矩阵输入。angle 可以支持标量或任意维数矩阵输入

2. 对于向量输入,phase 会对输出结果做判断,如果相邻两个输出角度的差的绝对值超过 3.5,phase 会对其重新处理,确保相邻两个角度差值的绝对值永远不超过3.5。而 angle 函数对每个数据独立求其辐角,不会因为相邻角度差超出某个数值而做特殊处理。所以,从这个意义上讲,angle 函数是我们通常需要使用的求角度的函数,而 phase 的特殊处理,会导致得出与angle不同的结果。

下面举例说明。

Example 1: 1维向量
g = [-1-1i -1+1i]; % 对应角度为 -3*pi/4 (=-2.3562) 和 3*pi/4 (=-2.3562)
ang = angle(g)
pha = phase(g)
复制代码
输出结果是:
ang =
-2.3562 2.3562

pha =
-2.3562 -3.9270
很显然,由于 2.3562与-2.3562的差值的绝对值超过了3.5,phase函数的处理使得得到的结果并非我们想要的,而angle函数是直接对每个输入数据求角度,不会考虑相邻两个角度的差值大小。所以,angle 求得的是我们需要的

Example 2:2维矩阵
g = [-1-1i -1+1i; -1-1i -1+1i];
ang = angle(g)
pha = phase(g)
复制代码
输出结果是:
ang =
-2.3562 2.3562
-2.3562 2.3562

Error using phase (line 17)
PHASE applies only to row or column vectors.
For matrices you have to decide along which dimension the
phase should be continuous.
从这个例子可以看出,对于矩阵输入,只有angle函数能正常工作,phase函数无法支持矩阵输入。

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
综上所述,如果我们对输出角度的差值没有限制,而只是单纯的求输入数据的辐角,我们应该用 angle 函数。所以,对于楼主的代码,最好将 phase 换成 angle 函数。

最后,建议楼主用 edit angle 和 edit phase 分别打开angle和phase两个函数,看看其内部具体实现,二者的差别就一目了然了。下面给出 angle 和 phase 函数的内部源代码,楼主可以自行比较:

% angle.m
function p = angle(h)
%ANGLE Phase angle.
% ANGLE(H) returns the phase angles, in radians, of a matrix with
% complex elements.
%
% Class support for input X:
% float: double, single
%
% See also ABS, UNWRAP.

% Copyright 1984-2010 The MathWorks, Inc.
% $Revision: 5.7.4.2 $ $Date: 2010/04/21 21:31:19 $

p = atan2(imag(h), real(h));
复制代码
% phase.m
function PHI=phase(G)
%PHASE Computes the phase of a complex vector
%
% PHI=phase(G)
%
% G is a complex-valued row vector and PHI is returned as its
% phase (in radians), with an effort made to keep it continuous
% over the pi-borders.

% L. Ljung 10-2-86
% Copyright 1986-2004 The MathWorks, Inc.
% $Revision: 1.5.4.2 $ $Date: 2004/07/31 23:24:49 $

%PHI = unwrap(angle(G));
[nr,nc] = size(G);
if min(nr,nc) > 1
error(sprintf(['PHASE applies only to row or column vectors.'...
'\nFor matrices you have to decide along which dimension the'...
'\nphase should be continuous.']))
end
if nr>nc
G = G.';
end
PHI=atan2(imag(G),real(G));
N=length(PHI);
DF=PHI(1:N-1)-PHI(2:N);
I=find(abs(DF)>3.5);
for i=I
if i~=0,
PHI=PHI+2*pi*sign(DF(i))*[zeros(1,i) ones(1,N-i)];
end
end
if nr>nc
PHI = PHI.';
end
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-12-03
hase 和 angle 在输入为单个标量数据时,没有差别,二者都是用 atan2 函数来求输入数据的四象限辐角。但是对于向量或矩阵数据输入时,二者差别非常大。

1. phase 只支持标量和一维(行、列)向量输入,不支持二维或高维矩阵输入。angle 可以支持标量或任意维数矩阵输入

2. 对于向量输入,phase 会对输出结果做判断,如果相邻两个输出角度的差的绝对值超过 3.5,phase 会对其重新处理,确保相邻两个角度差值的绝对值永远不超过3.5。而 angle 函数对每个数据独立求其辐角,不会因为相邻角度差超出某个数值而做特殊处理。所以,从这个意义上讲,angle 函数是我们通常需要使用的求角度的函数,而 phase 的特殊处理,会导致得出与angle不同的结果。

下面举例说明。

Example 1: 1维向量
g = [-1-1i -1+1i]; % 对应角度为 -3*pi/4 (=-2.3562) 和 3*pi/4 (=-2.3562)

ang = angle(g)

pha = phase(g)
复制代码
输出结果是:
ang =
-2.3562 2.3562

pha =
-2.3562 -3.9270
很显然,由于 2.3562与-2.3562的差值的绝对值超过了3.5,phase函数的处理使得得到的结果并非我们想要的,而angle函数是直接对每个输入数据求角度,不会考虑相邻两个角度的差值大小。所以,angle 求得的是我们需要的

Example 2:2维矩阵
g = [-1-1i -1+1i; -1-1i -1+1i];

ang = angle(g)

pha = phase(g)
复制代码
输出结果是:
ang =
-2.3562 2.3562
-2.3562 2.3562

Error using phase (line 17)
PHASE applies only to row or column vectors.
For matrices you have to decide along which dimension the
phase should be continuous.
从这个例子可以看出,对于矩阵输入,只有angle函数能正常工作,phase函数无法支持矩阵输入。

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
综上所述,如果我们对输出角度的差值没有限制,而只是单纯的求输入数据的辐角,我们应该用 angle 函数。所以,对于楼主的代码,最好将 phase 换成 angle 函数。

最后,建议楼主用 edit angle 和 edit phase 分别打开angle和phase两个函数,看看其内部具体实现,二者的差别就一目了然了。下面给出 angle 和 phase 函数的内部源代码,楼主可以自行比较:

% angle.m
function p = angle(h)

%ANGLE Phase angle.

% ANGLE(H) returns the phase angles, in radians, of a matrix with

% complex elements.

%

% Class support for input X:

% float: double, single

%

% See also ABS, UNWRAP.

% Copyright 1984-2010 The MathWorks, Inc.

% $Revision: 5.7.4.2 $ $Date: 2010/04/21 21:31:19 $

p = atan2(imag(h), real(h));
复制代码
% phase.m
function PHI=phase(G)

%PHASE Computes the phase of a complex vector

%

% PHI=phase(G)

%

% G is a complex-valued row vector and PHI is returned as its

% phase (in radians), with an effort made to keep it continuous

% over the pi-borders.

% L. Ljung 10-2-86

% Copyright 1986-2004 The MathWorks, Inc.

% $Revision: 1.5.4.2 $ $Date: 2004/07/31 23:24:49 $

%PHI = unwrap(angle(G));

[nr,nc] = size(G);

if min(nr,nc) > 1

error(sprintf(['PHASE applies only to row or column vectors.'...

'\nFor matrices you have to decide along which dimension the'...

'\nphase should be continuous.']))

end

if nr>nc

G = G.';

end

PHI=atan2(imag(G),real(G));

N=length(PHI);

DF=PHI(1:N-1)-PHI(2:N);

I=find(abs(DF)>3.5);

for i=I

if i~=0,

PHI=PHI+2*pi*sign(DF(i))*[zeros(1,i) ones(1,N-i)];

end

end

if nr>nc

PHI = PHI.';

end
复制代码
http://www.ilovematlab.cn/thread-259049-1-1.html
第2个回答  2016-11-22
phase 和 angle 在输入为单个标量数据时,没有差别,二者都是用 atan2 函数来求输入数据的四象限辐角。但是对于向量或矩阵数据输入时,二者差别非常大。

1. phase 只支持标量和一维(行、列)向量输入,不支持二维或高维矩阵输入。angle 可以支持标量或任意维数矩阵输入

2. 对于向量输入,phase 会对输出结果做判断,如果相邻两个输出角度的差的绝对值超过 3.5,phase 会对其重新处理,确保相邻两个角度差值的绝对值永远不超过3.5。而 angle 函数对每个数据独立求其辐角,不会因为相邻角度差超出某个数值而做特殊处理。所以,从这个意义上讲,angle 函数是我们通常需要使用的求角度的函数,而 phase 的特殊处理,会导致得出与angle不同的结果。
第3个回答  2016-11-06
这是在MATLAB论坛看到的答案:
phase 和 angle 在输入为单个标量数据时,没有差别,二者都是用 atan2 函数来求输入数据的四象限辐角。但是对于向量或矩阵数据输入时,二者差别非常大。
1. phase 只支持标量和一维(行、列)向量输入,不支持二维或高维矩阵输入。angle 可以支持标量或任意维数矩阵输入
2. 对于向量输入,phase 会对输出结果做判断,如果相邻两个输出角度的差的绝对值超过 函数中定义的数值,phase 会对其重新处理,确保相邻两个角度差值的绝对值永远不超过函数中定义的数值。而 angle 函数对每个数据独立求其辐角,不会因为相邻角度差超出某个数值而做特殊处理。所以,从这个意义上讲,angle 函数是我们通常需要使用的求角度的函数,而 phase 的特殊处理,会导致得出与angle不同的结果。
第4个回答  2016-10-12
一、区别:
phase 和 angle 在输入为单个标量数据时,没有差别,二者都是用 atan2 函数来求输入数据的四象限辐角。但是对于向量或矩阵数据输入时,二者差别非常大:
1、 phase 只支持标量和一维(行、列)向量输入,不支持二维或高维矩阵输入。angle 可以支持标量或任意维数矩阵输入。
2、对于向量输入,phase 会对输出结果做判断,如果相邻两个输出角度的差的绝对值超过 3.5,phase 会对其重新处理,确保相邻两个角度差值的绝对值永远不超过3.5。而 angle 函数对每个数据独立求其辐角,不会因为相邻角度差超出某个数值而做特殊处理。所以,从这个意义上讲,angle 函数是我们通常需要使用的求角度的函数,而 phase 的特殊处理,会导致得出与angle不同的结果。
二、下面举例说明。

1、Example 1: 1维向量
g = [-1-1i -1+1i]; % 对应角度为 -3*pi/4 (=-2.3562) 和 3*pi/4 (=-2.3562)
ang = angle(g)
pha = phase(g)
复制代码
输出结果是:
ang =-2.3562 2.3562
pha =-2.3562 -3.9270
很显然,由于 2.3562与-2.3562的差值的绝对值超过了3.5,phase函数的处理使得得到的结果并非我们想要的,而angle函数是直接对每个输入数据求角度,不会考虑相邻两个角度的差值大小。所以,angle 求得的是我们需要的。
2、Example 2:2维矩阵
g = [-1-1i孩虎粉臼莠铰疯歇弗忙 -1+1i; -1-1i -1+1i];
ang = angle(g)
pha = phase(g)
复制代码
输出结果是:
ang =-2.3562 2.3562
Error using phase (line 17)
PHASE applies only to row or column vectors.
For matrices you have to decide along which dimension the
phase should be continuous.
从这个例子可以看出,对于矩阵输入,只有angle函数能正常工作,phase函数无法支持矩阵输入。
三、综上所述,如果我们对输出角度的差值没有限制,而只是单纯的求输入数据的辐角,我们应该用 angle 函数。所以,对于楼主的代码,最好将 phase 换成 angle 函数。
相似回答