关于MATLAB与Python,有几点需要注意。在
首先,千万不要做from foo import *。这可能导致碰撞和意外行为。一般来说,import foo,from foo import bar,或{}更好。在
其次,MATLAB中的范围包含结尾,而{}中的范围则不包含结尾,因此像您所做的那样手动排除最后一个元素将使其比预期的更短。另外,对于Python范围,如果起始值是0,则不需要指定起始值。在
第三,在numpy中的size是数组的大小(因此是元素的总数)。在numpy中MATLABsize的等价物是shape。您可以使用numpyshape函数,但通常最好使用shape属性,它类似于附加到数组本身的函数,它是由arr.shape为数组arr获得的。在
类似地,您可以使用min、max和其他类似属性,使用arr.min()、arr.max()等。也没有nargout选项,只需使用arr.argmin()和{}来获得最小和最大索引。在
第四,有一个有用的函数np.zeros_like,它生成一个由所有零组成的数组,其形状和类型与给定的数组相同。还有一个对应的ones_like和full_like(后者用于np.full,这将创建一个由任意值填充的数组)。在
第五,在numpy版本中,trapz排在第一位,x排在第二位,而在{}版本中则相反。您可以通过使用命名参数(例如np.trapz(x=x, y=y))来保持这一点(当您这样做时,顺序并不重要)。这在MATLAB中根本不可能。在
第六,你可以像你在MATLAB中那样对Python进行切片,你不需要使用一个范围。在
第七,在Python和MATLAB中,通常最好避免使用带浮点值的范围。这是由于浮动的固有误差造成的。linspace更好。在
最后,您不需要用[]包围您的范围。它列出了一个数组的列表,这是您不需要的。在
下面是您的MATLAB代码移植到Python,使用上面的技巧。在import numpy as np
import matplotlib.pyplot as plt
dt = 0.01
t = np.linspace(0, 7, 7/0.01, endpoint=False)
# same as, but safer than:
# np.arange(0, 7, 0.01)
# you should do this sort of thing on matlab, too
sig1 = 1
xi_t = np.zeros_like(t)
array_pos_start = abs(t-t[0]).argmin()
array_pos_stop = abs(t-t[-1]/2).argmax()
p_len = np.linspace(0, t[array_pos_stop]-t[array_pos_start], array_pos_stop-array_pos_start)
xi_t[array_pos_start:array_pos_stop] = np.exp(p_len*sig1/2)*np.sqrt(sig1)
norm = np.trapz(y=xi_t.dot(xi_t.conj()), x=t)
xi = xi_t/np.sqrt(norm)