2013-03-13 45 views
0

我最近一直在試圖將一段Matlab代碼轉換爲Python代碼。Matlab to Python轉換 - 無法分配給函數調用

我已經做大多數的,我需要但是,我遇到的問題是,它說行了變化:

y(index(m)) = 1-x(index(m)); 

我得到的錯誤:

「不能分配以函數調用「

但我不知道如何重組它以便消除此錯誤。

我看了一下,人們提到「get item」和「set item」,但是我嘗試過使用它們,但我無法讓它們工作(可能是因爲我無法弄清楚結構)

下面是完整的代碼:

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 

在此先感謝

回答

3

圓括號()指示功能。對於索引,你需要[]方括號 - 但這只是衆多錯誤中的第一個......我目前正在逐行進行,但這需要一段時間。

此代碼至少運行...您需要確定索引是否正在執行您期望的操作,因爲Python數組從零開始索引,並且Matlab數組從1開始。我嘗試在幾個地方,但沒有經過逐行 - 這是調試。

一些重要經驗:

  • 沒有end聲明...只是停止縮進
  • 當你輸入一個庫,你需要引用它(numpy.zeros,不zeros
  • 列表是從零索引,而不是一個
  • 索引是用[]完成的,而不是()
  • 創建一個r數組通過[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; 
+0

非常感謝你,你一直在給我很大的幫助,我現在就通過它來試着理解你所做的一切。再次感謝 – 2013-03-13 16:22:48