Matlab到Python的转换 - 无法分配给函数调用

时间:2013-03-13 15:32:05

标签: python function matlab call assign

我最近一直试图将一段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 个答案:

答案 0 :(得分: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;