2013-11-24 25 views
0

我一直在嘗試幾天來實現一個簡單的程序從Matlab代碼到Python。我正在使用numpy,但是如果有更好的方式,我會接受它。在Python中的動態編程

這是我的Matlab代碼:

x=[1,1,1,9]; 
A=zeros(length(x),length(x)); 
for i=length(x):-1:1 
    for j=length(x):-1:i 
     if i==length(x) 
      A(i,j)=x(i); 
     else 
      if j>i 
       A(i,j)=A(i+1,j)+(j-i); 
      elseif j==i 
       A(i,j)=x(i)+min(A(j+1,j+1:end)); 
      end 
     end 
    end 
end 
y=min(A(1,:)); 

它創建該矩陣:

12 12 13 15 
0 11 11 12 
0  0 10 10 
0  0  0  9 

和最後的結果是12(最小從第一行)。 這是我在Python這樣做的遠:

import numpy as np 

items = np.array([1,1,1,9]) 
sizeLimit = len(items) 
P = np.zeros((len(items),len(items))) 

for i in range(0, sizeLimit): 
    for j in range(i, sizeLimit): 
    if i == sizeLimit-1: 
     P[i,j] = items[i] 
    else: 
     if j > i: 
      P[i,j] = P[i+1,j] + [j-i] 
     elif j == i: 
      P[i,j] = items[i] + P[0, 0:].min() 
print P 

好像它被卡住的地方,不重複。

我會感謝任何幫助。

+1

很難理解你的代碼。你能解釋這是什麼意圖嗎?我的意思是,你想在矩陣中得到什麼樣的模式? – Christian

回答

1

我已經成功地複製您的MATLAB與結果:

import numpy as np 

items = np.array([1,1,1,9]) 
sizeLimit = len(items) 
P = np.zeros((len(items),len(items))) 

for i in range(sizeLimit-1, -1, -1): 
    for j in range(sizeLimit-1, i-1, -1): 
    if i == sizeLimit-1: 
     P[i,j] = items[i] 
    else: 
     if j > i: 
      P[i,j] = P[i+1,j] + [j-i] 
     elif j == i: 
      P[i,j] = items[i] + P[j+1, (j+1):].min() 

給予我

>>> print P 
[[ 12. 12. 13. 15.] 
[ 0. 11. 11. 12.] 
[ 0. 0. 10. 10.] 
[ 0. 0. 0. 9.]] 

的關鍵點是翻譯之類的東西:

octave:1> 4:-1:1 
ans = 

    4 3 2 1 

>>> sizeLimit = 4 
>>> range(sizeLimit-1, -1, -1) 
[3, 2, 1, 0] 

在你原來的Python代碼中,事情是顛倒過來的。與Matlab函數不同,range也排除了終點。您還需要小心解釋與Matlab不同的事實,Python具有基於0的索引。

+1

非常感謝。它的工作完美。我知道基於0的索引,並且在過去兩天嘗試了許多組合,但無法使其工作。我知道我很接近:)。再次感謝。 – whyname

+0

沒問題。過去多次經歷過同樣的問題。 – YXD