说我想画一个相位数组
ph = [1, 40, 80, 179, -173, -150, -90, -40, -3, 3] on an X-Y plot.
[179,-173]之间的跳跃是如此可怕,以至于我使用mod(ph + 360,360)来摆脱它。然而,这使得[-3,3]变为[357,3]。
我知道我可以有一个循环来删除所有这种不连续性。但我想知道是否有一种更优雅的方式。
答案 0 :(得分:6)
你应该研究一维相位展开。在Matlab中,Python中的unwrap
函数和类似的numpy.unwrap
用于弧度参数。在Matlab中:
ph = [1, 40, 80, 179, -173, -150, -90, -40, -3, 3];
ph2 = unwrap(ph*pi/180)*180/pi
返回:
ans =
Columns 1 through 7
1.0000 40.0000 80.0000 179.0000 187.0000 210.0000 270.0000
Columns 8 through 10
320.0000 357.0000 363.0000
如果要查看代码或者您确实需要特定于度的版本,请在命令窗口中键入edit unwrap
。这是矢量输入的简化版本(有关每行的详细注释,请参阅unwrap
):
function p = unwrap_deg(p)
m = length(p);
dp = diff(p,1);
dps = mod(dp+180,360)-180;
dps(dps==-180 & dp>0) = 180;
dp_corr = dps-dp;
dp_corr(abs(dp)<180) = 0;
p(2:m) = p(2:m)+cumsum(dp_corr);
然后
ph = [1, 40, 80, 179, -173, -150, -90, -40, -3, 3];
ph2 = unwrap_deg(ph)
返回
ans =
1 40 80 179 187 210 270 320 357 363
答案 1 :(得分:1)
您可以将数据表示为quaternions,这基本上是表示三维空间中的坐标加上旋转的紧凑方式。四元数很酷的是它们可以避免角度不连续。
您可以看到使用这些here的优势,大约是页面的1/4。您的旋转角度始终通过操作[-1, 1]
映射到间隔q4 = cos(theta / 2)
。这可以帮助您在没有不连续的情况下表示您的数据。