将Matlab转换为Python

时间:2015-03-13 04:57:03

标签: python matlab

我在将一部分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)

任何帮助将不胜感激,谢谢!

2 个答案:

答案 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} trapznp.trapz之间的区别。 MATLAB返回一个正数(~31),而np.trapz返回一个负数(〜-31)。

所以我不确定最后一行中的额外abs是不是很好的做法,但除此之外,代码会显示生成相同的xi序列。

答案 1 :(得分:0)

有关MATLABPython的一些注意事项。

首先,永远不要from foo import *。这可能导致冲突和意外行为。通常情况下,import foofrom foo import barimport foobar as fo会更好。

其次,MATLAB中的范围包括结尾,而Python中的范围则不包括,因此手动排除最后一个元素会使其比预期的短。此外,对于Python范围,如果为0,则无需指定开头。

第三,size中的numpy是数组的大小(因此是元素的总数)。 MATLABsize numpy的等效值为shape。您可以使用numpy shape函数,但通常最好使用shape属性,这类似于附加到数组本身的函数,它是为数组{{ 1}} arr

同样,您可以使用arr.shapemin等获取maxarr.min()和其他此类属性。此处也没有arr.max()选项,只需使用nargoutarr.argmin()来获取最小和最大索引。

第四,有一个有用的函数arr.argmax(),它使所有零的数组具有与给定数组相同的形状和类型。还有一个对应的np.zeros_likeones_like(后者用于full_like,它会创建一个填充了任意值的数组。)

第五,在np.full numpytrapz中,y位居第一,x位居第二,而在MATLAB版本则相反。您可以使用命名参数(例如np.trapz(x=x, y=y))来保持这一点(当您执行此操作时,顺序无关紧要)。这在MATLAB根本无法实现。

第六,你可以像Python一样切入MATLAB,你不需要使用范围。

第七,在PythonMATLAB中,通常最好避免使用具有浮点值的范围。这是由于浮子固有的不准确性。 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)