2017-06-16 35 views
0

有誰知道它爲什麼告訴我列表索引超出範圍?我試圖「翻譯」一個Matlab文件,並且我創建了列表而不是單元陣列,現在主要問題在於索引,它對我來說似乎是正確的,我不知道如何有問題從Matlab翻譯成Python。列表索引超出範圍。

#Projection operator Pi 
piOperator = np.zeros((N*N, N*N)) 

#Psi0 state 
Psi0 = np.zeros((N*N, 1)) 
for i in xrange(0 , N-1): 
    aux = np.zeros((N,1)) #Auxiliary vector 
    aux[i]= 1 
    A = np.sqrt(G[:,i]) 
    psi = [] 
    P = [] 
    psi.append(np.tensordot(aux, A)) 
    P.append(np.dot(psi[i],np.transpose(psi[i]))) 
    piOperator = piOperator + P[i] 
    Psi0 = Psi0 + psi[i] 


Psi0 = 1/np.sqrt(N)*Psi0 


--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-450-0816498ad018> in <module>() 
11  P = [] 
12  psi.append(np.tensordot(aux, A)) 
---> 13  P.append(np.dot(psi[i],np.transpose(psi[i]))) 
14  piOperator = piOperator + P[i] 
15  Psi0 = Psi0 + psi[i] 

IndexError: list index out of range 

原來Matlab代碼是:

Pi = zeros(n^2,n^2); 
Psi0 = zeros(n^2,1); 
for k=1:n 
    aux = zeros(n,1); 
    aux(k) = 1; 
    psi{k} = kron(aux,sqrt(G(:,k))); 
    P{k} = psi{k} * psi{k}'; 
    Pi = Pi + P{k}; 
    Psi0 = Psi0 + psi{k}; 
end 
Psi0 = 1/sqrt(n)*Psi0; 
+1

能否請您發表完整的代碼片段?例如,G缺失。 – csl

回答

2

您清除PSI變量每次迭代。在循環之前只是初始化:

#Projection operator Pi 
piOperator = np.zeros((N*N, N*N)) 

#Psi0 state 
Psi0 = np.zeros((N*N, 1)) 
psi = [] 
P = [] 
for i in xrange(0 , N-1): 
    aux = np.zeros((N,1)) #Auxiliary vector 
    aux[i]= 1 
    A = np.sqrt(G[:,i]) 
    psi.append(np.tensordot(aux, A)) 
    P.append(np.dot(psi[i],np.transpose(psi[i]))) 
    piOperator = piOperator + P[i] 
    Psi0 = Psi0 + psi[i] 


Psi0 = 1/np.sqrt(N)*Psi0 
+0

非常感謝!我是這樣一個傻瓜:) –

+0

我們都有這個問題有時哈哈:),標記答案爲接受:) – Ivan