【问题标题】:Matlab to Python conversion - Can't assign to function callMatlab 到 Python 的转换 - 无法分配给函数调用
【发布时间】:2013-03-01 15:24:40
【问题描述】:

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

提前致谢

【问题讨论】:

    标签: python function matlab call assign


    【解决方案1】:

    圆括号() 表示一个函数。对于索引,您需要 [] 方括号 - 但这只是众多错误中的第一个……我目前正在逐行查看,但这需要一段时间。

    这段代码至少可以运行...您需要确定索引是否符合您的预期,因为 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;
    

    【讨论】:

    • 非常感谢你,你帮了我很大的忙,我现在就通过它并尝试理解你所做的一切。再次感谢
    猜你喜欢
    • 1970-01-01
    • 2017-03-01
    • 2015-04-23
    • 2021-06-06
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多