从Matlab转换为Python。列表索引超出范围。

时间:2017-06-16 08:48:04

标签: python matlab

有谁知道为什么它告诉我列表索引超出范围?我试图"翻译"一个Matlab文件和我创建的列表而不是单元格数组,现在的主要问题在于索引,这对我来说似乎是正确的,我不知道有什么问题

#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 个答案:

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