将MATLAB代码移植到Python

时间:2016-11-29 08:42:36

标签: python matlab

更新反映意见

我需要将MATLAB代码移植到python中。不幸的是,尽管很多os不眠之夜的调试和谷歌搜索,我无法让我的代码运行。以下是有问题的MATLAB代码:

clc;
serie =0:50;
serie = serie - mean(serie);
y = cumsum(serie);
L = length(y);
%Calculate the detrended fluctuation short term coefficient
npuntos = 10;
f1=zeros(1,npuntos);
for n1=4:16
%Segmentation
seg =(1:n1:L);
%disp(length(seg))
yn = zeros(1,L);
    for k = 1:length(seg)-1
        yaux = y(seg(k):seg(k+1)-1);
        x = 1:length(yaux);
        A=[sum(x.^2),sum(x); sum(x),length(x)];
        C=[sum(x.*yaux);sum(yaux)];
        v=inv(A)*C;
        a=v(1); b=v(2);
        pen=a;
        ord=b;
        ytrend = pen*x + ord;
        yn(seg(k):seg(k+1)-1) = ytrend';
    end
f1(n1) = sqrt((1/seg(end)).*sum((y(1:seg(end)-1)-yn(1:seg(end)-1)).^2));
end
n1=4:16;
f1=f1(4:end);
p1 = polyfit(log10(n1(1:end-2)),log10(f1(1:end-2)),1);
alpha1 = p1(1);
disp(alpha1)

我将代码翻译成python的尝试如下:



import numpy as np

data = np.arange(start=0, stop=51, step=1)
data = data.transpose()
data = data - np.mean(data)
y = np.cumsum(data)
L = len(y)
# Estimate the value of alpha1

npuntos = 12
f1 = [0] * npuntos
for i, n1 in enumerate(np.arange(start=4, stop=16, step=1)):
    seg = np.arange(start=0, stop=L, step=n1)  # Potential error
    yn = [0] * L
    for k in np.arange(start=0, stop=len(seg)-1, step=1):  # Potential Error
        yaux = y[seg[k]:seg[k + 1]-1]  # Potential Error
        x = np.arange(start=1, stop=len(yaux) + 1, step=1)
        A = [[sum(x ** 2), sum(x)], [sum(x), len(x)]]
        C = [[sum(x * yaux)], [sum(yaux)]]
        v = (np.linalg.inv(A)).dot(C)
        pen = v[0]
        ord = v[1]
        ytrend = pen * x + ord
        yn[seg[k]: seg[k + 1] - 1] = ytrend
    f1[i] = np.sqrt((1 / seg[-1]) * sum((y[1:seg[-1] - 1] - yn[1:seg[-1] - 1]) ** 2))
n1 =np.arange(start=4, stop=16, step=1)
f1 = f1[4:]
xx =np.log10(n1[1: - 2])
yy=np.log10(f1[1: - 2])
print(len(xx))
print(len(yy))
p1 = np.polyfit(xx, yy, 1)
alpha1 = p1[1]
print(alpha1)




不幸的是,当程序执行此行时,我得到TypeError

p1 = np.polyfit(xx, yy, 1)

这确实是预期的,因为xx的长度为9,而xx只是5.通过使用评论中建议的try / catch块,

try:
    f1[n1] = np.sqrt((1 / seg[-1]) * sum((y[1:seg[-1] - 1] - yn[1:seg[-1] - 1]) ** 2))
except IndexError:
    f1.append(np.sqrt((1 / seg[-1]) * sum((y[1:seg[-1] - 1] - yn[1:seg[-1] - 1]) ** 2)))

错误由输出修复完全错误。

我已经通过调试器,但我不能完全如何错误。有人可以帮忙吗? P.S-如果有人有兴趣,上述片段应该计算Detrended Fluctuation Analysis (DFA)

1 个答案:

答案 0 :(得分:3)

多数民众赞成因为你有npuntos = 10f1 = [0] * npuntos使f1 list的大小等于10。然后你迭代

for n1 in np.arange(start=4, stop=16, step=1):

访问10到15之间的f1[n1]将为您提供IndexError

<强>更新

首先,您可以使用np.zeros((5,), dtype=np.int),因为您已经使用了np模块。

其次要找出IndexError的东西。就个人而言,我不想陷入您正在解决的数学问题,因此解决方案将不是最好的。只是略有变化。我相信你知道Python索引是基于零的。因为你将开始填充你的第5个元素。我不确定你是否想要它。您可以enumerate(np.arange(start=4, stop=16, step=1))为列表创建基于零的索引:

for i, n1 in enumerate(np.arange(start=4, stop=16, step=1)):
    ...
    f1[i] = np.sqrt((1 / seg[-1]) * sum((y[1:seg[-1] - 1] - yn[1:seg[-1] - 1]) ** 2))

len(np.arange(start=4, stop=16, step=1)) 12f110)的尺寸不一致12。因此,从那时起,您可以创建npuntos = 12 f1 = [0] * npuntos # or np.zeros((5,), dtype=np.int) 元素列表。

append

或者,如果需要,您可以像在MATLAB中那样f1[n1] = np.sqrt((1 / seg[-1]) * sum((y[1:seg[-1] - 1] - yn[1:seg[-1] - 1]) ** 2)) 值(如@nekomatic所说)。

所以你需要换行

try / except
try: f1[n1] = np.sqrt((1 / seg[-1]) * sum((y[1:seg[-1] - 1] - yn[1:seg[-1] - 1]) ** 2)) except IndexError: f1.append(np.sqrt((1 / seg[-1]) * sum((y[1:seg[-1] - 1] - yn[1:seg[-1] - 1]) ** 2))) 中的

{{1}}