我在将一部分MatLab代码转换为Python时遇到了麻烦。以下是MatLab代码;
sig1 = 1;
xi_t = zeros(size(t));
[min_dif, array_pos_start] = min(abs(t -t(1) ));
[min_dif, array_pos_stop ] = min(abs(t -t(end)/2));
p_len = [0: (t(2))-t(1) : ( t(array_pos_stop) - t(array_pos_start))];
xi_t(array_pos_start:array_pos_stop)= sqrt(sig1)*exp((sig1/2)*p_len);
norm = trapz(t,xi_t.*conj(xi_t));
xi = xi_t/sqrt(norm);
其中
dt = 1e-2; % time step
t = [0:dt:7-dt]; % t
我尝试了以下转换,但无效。
from numpy import *
from matplotlib import *
dt=0.01
t=[arange_(0,7 - dt,dt)]
sig1=1
xi_t=zeros(size(t))
min_dif, array_pos_start = min(abs(t - t[0],nargout=2)
min_dif, array_pos_stop = min(abs(t - (t[-1]) / 2),nargout=2)
p_len=[arange_(0,(t(array_pos_stop) - t(array_pos_start)),(t[1]) - t[0])]
xi_t[arange_(array_pos_start,array_pos_stop)]=sqrt(sig1) * exp((sig1 / 2) * p_len)
norm=trapz(t,xi_t.dot(conj(xi_t)))
xi=xi_t / sqrt(norm)
任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
怎么样:
import math
import numpy as np
def _min(x):
return [np.amin(x), np.argmin(x)]
dt = 1e-2; # time step
t = np.arange(0, 7, dt) # t
sig1 = 1;
xi_t = np.zeros(len(t));
[min_dif, array_pos_start] = _min(abs(t -t[0] ));
[min_dif, array_pos_stop ] = _min(abs(t -t[-1]/2.0));
step = t[1]-t[0]
p_len = np.arange(0, t[array_pos_stop] - t[array_pos_start] + step, step)
xi_t[array_pos_start:array_pos_stop+1] = math.sqrt(sig1) * np.exp((sig1/2.0)*p_len);
norm = np.trapz(t, xi_t * np.conj(xi_t));
xi = xi_t/np.sqrt(abs(norm));
我不确定的一件事是MATLAB&{39} trapz
和np.trapz
之间的区别。 MATLAB返回一个正数(~31),而np.trapz
返回一个负数(〜-31)。
所以我不确定最后一行中的额外abs
是不是很好的做法,但除此之外,代码会显示生成相同的xi
序列。
答案 1 :(得分:0)
有关MATLAB
与Python
的一些注意事项。
首先,永远不要from foo import *
。这可能导致冲突和意外行为。通常情况下,import foo
,from foo import bar
或import foobar as fo
会更好。
其次,MATLAB
中的范围包括结尾,而Python
中的范围则不包括,因此手动排除最后一个元素会使其比预期的短。此外,对于Python
范围,如果为0
,则无需指定开头。
第三,size
中的numpy
是数组的大小(因此是元素的总数)。 MATLAB
中size
numpy
的等效值为shape
。您可以使用numpy
shape
函数,但通常最好使用shape
属性,这类似于附加到数组本身的函数,它是为数组{{ 1}} arr
。
同样,您可以使用arr.shape
,min
等获取max
,arr.min()
和其他此类属性。此处也没有arr.max()
选项,只需使用nargout
和arr.argmin()
来获取最小和最大索引。
第四,有一个有用的函数arr.argmax()
,它使所有零的数组具有与给定数组相同的形状和类型。还有一个对应的np.zeros_like
和ones_like
(后者用于full_like
,它会创建一个填充了任意值的数组。)
第五,在np.full
numpy
版trapz
中,y
位居第一,x
位居第二,而在MATLAB
版本则相反。您可以使用命名参数(例如np.trapz(x=x, y=y)
)来保持这一点(当您执行此操作时,顺序无关紧要)。这在MATLAB
根本无法实现。
第六,你可以像Python
一样切入MATLAB
,你不需要使用范围。
第七,在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)