Matlab转Python - 无法对函数调用赋值
我最近在尝试把一段Matlab代码转换成Python代码。
我已经做了大部分需要的修改,但我遇到的问题是这一行:
y(index(m)) = 1-x(index(m));
我收到的错误是:
“无法给函数调用赋值”
不过我不太确定该怎么调整才能去掉这个错误。
我查了一下,有人提到“获取项目”和“设置项目”,但是我试着用过,还是搞不定(可能是因为我不太明白结构)
这是完整的代码:
import numpy
N = 100;
B = N+1;
M = 5e4;
burnin = M;
Niter = 20;
p = ones(B,Niter+1)/B;
hit = zeros(B,1);
for j in range(1,Niter):
x = double(rand(1,N)>0.5);
bin_x = 1+sum(x);
index = ceil(N*rand(1,M+burnin));
acceptval = rand(1,M+burnin);
for m in range(1,M+burnin):
y = x;
y(index(m)) = 1-x(index(m));
bin_y = 1+sum(y);
alpha = min(1, p(bin_x,j)/p(bin_y,j) );
if acceptval(m)<alpha:
x = y; bin_x = bin_y;
end
if m > burnin: hit(bin_x) = hit(bin_x)+1; end
end
pnew = p[:,j];
for b in range(1,B-1):
if (hit(b+1)*hit(b) == 0):
pnew(b+1) = pnew(b)*(p(b+1,j)/p(b,j));
else:
g(b,j) = hit(b+1)*hit(b) / (hit(b+1)+hit(b));
g_hat(b) = g(b,j)/sum(g(b,arange(1,j)));
pnew(b+1) = pnew(b)*(p(b+1,j)/p(b,j))+((hit(b+1)/hit(b))^g_hat(b));
end
end
p[:,j+1] = pnew/sum(pnew);
hit[:] = 0;
end
提前谢谢你们
1 个回答
3
圆括号 ()
表示一个函数。如果你要进行索引操作,需要用方括号 []
,但这只是许多错误中的第一个...我现在正在逐行检查代码,但这需要一些时间。
这段代码至少能运行...你需要确认索引是否按你预期的那样工作,因为在Python中,数组的索引是从零开始的,而在Matlab中,数组是从1开始的。我在几个地方尝试修复这个问题,但没有逐行检查,这就是调试的过程。
一些关键的学习点:
- 没有
end
语句...只需停止缩进即可 - 当你导入一个库时,需要引用它(比如
numpy.zeros
,而不是zeros
) - 列表的索引是从零开始的,而不是从一开始
- 索引是用
[]
来做的,而不是()
- 创建一个随机数数组是用
[random.random() for r in xrange(N)]
,而不是random(N)
。 - ... 还有很多其他的事情,你在下面的代码中会发现。
祝你好运!
import numpy
import random
N = int(100);
B = N+1;
M = 5e4;
burnin = M;
Niter = 20;
p = numpy.ones([B,Niter+1])/B;
hit = numpy.zeros([B,1]);
g = numpy.zeros([B, Niter]);
b_hat = numpy.zeros(B);
for j in range(1,Niter):
x = [float(random.randint(0,1)>0.5) for r in xrange(N)];
bin_x = 1+sum(x);
index = [random.randint(0,N-1) for r in xrange(int(M+burnin))];
#acceptval = rand(1,M+burnin);
acceptval = [random.random() for r in xrange(int(M+burnin))];
for m in range(1,int(M+burnin)):
y = x;
y[index[m]] = 1-x[index[m]];
bin_y = 1+sum(y);
alpha = min(1, p[bin_x,j]/p[bin_y,j] );
if acceptval[m]<alpha:
x = y; bin_x = bin_y;
if m > burnin:
hit[bin_x] = hit[bin_x]+1;
pnew = p[:,j];
for b in range(1,B-1):
if (hit[b+1]*hit[b] == 0):
pnew[b+1] = pnew[b]*(p[b+1,j]/p[b,j]);
else:
g[b,j] = hit[b+1]*hit[b] / [hit[b+1]+hit[b]];
g_hat[b] = g[b,j]/sum(g[b,numpy.arange(1,j)]);
pnew[b+1] = pnew[b]*(p[b+1,j]/p[b,j])+((hit[b+1]/hit[b])^g_hat[b]);
p[:,j+1] = pnew/sum(pnew);
hit[:] = 0;