[英]Porting a MATLAB code to Python
更新以反映评论
我需要将MATLAB代码移植到python中。 不幸的是,尽管在调试和谷歌搜索上经历了很多不眠之夜,但是我却无法运行我的代码。 这是有问题的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)))
错误是由输出修正的,完全是错误的。
我已经通过调试器,但是我不能完全理解该错误。 有人可以帮忙吗? PS-如果有人感兴趣,以上代码段应用于计算去趋势波动分析(DFA) 。
那是因为您的npuntos = 10
所以f1 = [0] * npuntos
使f1
list
的大小等于10
。 然后你遍历
for n1 in np.arange(start=4, stop=16, step=1):
并访问从1到15的f1[n1]
会给您一个IndexError
UPDATE
首先,您可以使用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))
是12
不是你创建的尺寸f1
( 10
)。 因此,从那时起您可以创建12
元素列表。
npuntos = 12
f1 = [0] * npuntos # or np.zeros((5,), dtype=np.int)
或者,你可以做append
,如果它需要ING值,因为它在MATLAB进行(如@nekomatic说明)。
所以你需要包装
f1[n1] = np.sqrt((1 / seg[-1]) * sum((y[1:seg[-1] - 1] - yn[1:seg[-1] - 1]) ** 2))
在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)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.