我正在尝试将我的代码从Matlab移植到Python。除了Matlab的函数外,它似乎大部分都能工作。
wrapToPi
我使用的是numpy的解包函数
np.unwrap
模仿wrapToPi,但它似乎不起作用。在Matlab页面上,它说
lambdaWrapped = wrapToPi( lambda )以λ和弧度将角包装到−π区间。pi映射到pi,−pi映射到−pi。(通常,pi映射到pi的奇数,正倍数,π映射到−pi的奇数,负倍数。)
wrapToPi和np.unwrap有什么不同?
发布于 2017-12-12 06:49:03
Octave的mapping
插件有以下代码:
function xwrap = wrapToPi(x)
xwrap = rem (x, 2*pi);
idx = find (abs (xwrap) > pi);
xwrap(idx) -= 2*pi * sign (xwrap(idx));
endfunction
unwrap
中的numpy
和Octave
(大概还有MATLAB)是完全不同的。
>> x=linspace(-2*pi, 2*pi, 10)
x =
Columns 1 through 8:
-6.28319 -4.88692 -3.49066 -2.09440 -0.69813 0.69813 2.09440 3.49066
Columns 9 and 10:
4.88692 6.28319
>> wrapToPi(x)
ans =
Columns 1 through 8:
0.00000 1.39626 2.79253 -2.09440 -0.69813 0.69813 2.09440 -2.79253
Columns 9 and 10:
-1.39626 0.00000
在numpy
中,我可以通过以下方式复制:
In [274]: x = np.linspace(-2*np.pi, 2*np.pi, 10)
In [275]: x
Out[275]:
array([-6.28318531, -4.88692191, -3.4906585 , -2.0943951 , -0.6981317 ,
0.6981317 , 2.0943951 , 3.4906585 , 4.88692191, 6.28318531])
In [276]: xwrap=np.remainder(x, 2*np.pi)
In [277]: mask = np.abs(xwrap)>np.pi
In [278]: xwrap[mask] -= 2*np.pi * np.sign(xwrap[mask])
In [279]: xwrap
Out[279]:
array([ 0. , 1.3962634, 2.7925268, -2.0943951, -0.6981317,
0.6981317, 2.0943951, -2.7925268, -1.3962634, 0. ])
发布于 2022-04-18 16:59:26
基于hpaulj的回答,这里有一个与Matlab完全相同的函数。只需确保输入为numpy数组即可。
def wrapToPi(x):
xwrap = np.remainder(x, 2 * np.pi)
mask = np.abs(xwrap) > np.pi
xwrap[mask] -= 2 * np.pi * np.sign(xwrap[mask])
mask1 = x < 0
mask2 = np.remainder(x, np.pi) == 0
mask3 = np.remainder(x, 2 * np.pi) != 0
xwrap[mask1 & mask2 & mask3] -= 2 * np.pi
return xwrap
https://stackoverflow.com/questions/47764452
复制相似问题