Matlab转Python - 无法对函数调用赋值

0 投票
1 回答
1054 浏览
提问于 2025-04-17 18:57

我最近在尝试把一段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;

撰写回答