2013-05-05 472 views
-2

我在Matlab中遇到這個問題:由於其中一個函數被調用了很多,因此達到了500的最大遞歸限制。這真令人沮喪。網絡上的這個問題有很多。但是我看起來非常好,沒有一個真正的解決方案來解決這個問題。即使使用set(0,'RecursionLimit',N)增加遞歸限制也沒有幫助,因爲在我這樣做並運行我的代碼之後,Matlab崩潰了(並且它崩潰了N ii的任何值)500的最大遞歸限制達到了錯誤

FYI,my code應該稱爲超過500次的函數之一,所以它沒有任何問題。那麼有什麼辦法可以增加Matlab的遞​​歸限制(不會崩潰),或者更好地使其無限制?

+0

你可能會發布代碼或500次遞歸函數的名稱嗎? – 2013-05-05 21:30:36

回答

0

您可以嘗試增加MATLAB使用的堆棧大小,因爲一旦堆棧已滿,遞歸通常會中斷。

注意到,有一個函數的函數之間的根本區別在於被稱爲 500倍和遞歸 500倍。在MATLAB中,後者非常罕見。你確定你需要這個遞歸嗎?

+0

@woodchips ....我知道訪問這個文件超過500次是正常的,因爲這是算法的工作原理(如果你感興趣,請閱讀Pohst枚舉 這不是錯誤bcoz堆棧正在被填充!發生這個錯誤bcoz matlab假設它被卡住了在一個循環中...雖然它不是 這個錯誤不會發生在C或Java ....反正....感謝很多傢伙...這似乎我必須寫我的cood使用循環而不是調用文件 – user2329321 2013-05-06 17:12:23

+0

@ user2329321 - 爲什麼迴應這個答案,而不是我給的那個?不管怎麼說,不要爭辯說代碼是做一些正常的事情,問題出現意味着有一個問題,你不能這可能意味着你的代碼被錯誤地實現了,這可能意味着你選擇的實現很差 – 2013-05-07 02:35:46

+0

@woodchips ....對不起,我在這裏回覆,我很匆忙,沒有注意到我在哪裏打字。無論如何,我真的不明白你爲什麼堅持你的觀點。再次閱讀Pohst枚舉算法,瞭解它爲什麼正常。順便說一句,我再次實現了該算法,同一部分仍然運行超過500次,我沒有得到這個錯誤。唯一的區別是我這次使用嵌套循環編寫代碼,而不是調用其他文件中的代碼,這當然更復雜一些。無論如何,感謝您的幫助和豐富的反饋。 – user2329321 2013-05-08 09:42:16

1

要說500倍遞歸沒有什麼錯誤本身可能是錯誤的。

遞歸的一個問題是MATLAB每次調用一個函數時都必須設置獨立的工作空間,從而建立起一個堆棧。這可能相當低效,耗費大量時間和內存。所以你在做什麼可能會有問題。

同樣,我經常見到遞歸函數可以被重寫爲不遞歸。像memoization技術可以用來避免多次遞歸評估相同輸入的函數。爲什麼同一個計算不止一次?

您可以更改堆棧大小的限制,但通常這些限制非常合理,並且放在那裏以防止出現內存和時間問題。所以你最好認真看待你的代碼,以決定這樣的改變是否合適,而不是重新表達你的問題。

例如,您可以使用遞歸計算因子,但爲什麼要麻煩?當一個簡單的循環更加高效時,這是一個非常愚蠢的解決方案。堆棧的開銷遠遠超過當循環充足時你想要花費的時間。

另一個例子是斐波那契數列。它可以遞歸地編寫,這是一件容易的事,但這並不能使它成爲一件好事。完全遞歸計算,第n個斐波那契數將需要指數時間和內存來計算F(n)。循環更好,它可以讓你做O(n)的工作量。更好的是,記憶方案加上適當的身份允許在O(log2(n))時間內計算F(n)。

的一點是,你可以解決遞歸很多問題,但是,這並不意味着這是這樣做的正確方法。

+0

「例如,您可以使用遞歸計算階乘,但爲什麼要麻煩呢?當一個簡單的循環效率更高時,這是一個非常愚蠢的解決方案。」 – WorBlux 2013-05-07 02:14:26

1

問題:達到500的最大遞歸限制。使用set(0,'RecursionLimit',N)更改限制。是 意識到超出您的可用堆棧空間可能會導致MATLAB和/或您的計算機崩潰。 程序:

puma560; 
robot=p560 
N=5; % Numero de Iteraciones 
z=linspace(0.432,0.482,N); % se mueve 0.05 unidades 
x=zeros(1,N); 
y=x; 
for j=1:N 
y(1,j)=-0.15; 
x(1,j)=0.452; 
end 
phi=zeros(1,N); 
for k=1:length(z) 
phik=phi(k); 
T(:,:,k)=[cos(phik) -sin(phik) 0 x(k); 
      sin(phik) cos(phik) 0 y(k); 
      0 0 1 z(k); 
      0 0 0 1]; 
end 
qzz=ikine(robot,T) 
plot(robot,qzz) 

y=linspace(-0.15,0.05,N); % se mueve 0.20 unidades 
x=zeros(1,N); 
z=x; 
for j=1:N 
x(1,j)=0.452; 
z(1,j)=0.482; 
end 
phi=zeros(1,N); 
for k=1:length(y) 
phik=phi(k); 
T(:,:,k)=[cos(phik) -sin(phik) 0 x(k); 
      sin(phik) cos(phik) 0 y(k); 
      0 0 1 z(k); 
      0 0 0 1]; 
end 
qyy=ikine(robot,T) 
plot(robot,qyy) 

x=linspace(0.452,0.702,N); % se mueve 0.25 unidades 
y=zeros(1,N); 
z=y; 
for j=1:N 
y(1,j)=0.05; 
z(1,j)=0.482; 
end 
phi=zeros(1,N); 
for k=1:length(x) 
phik=phi(k); 
T(:,:,k)=[cos(phik) -sin(phik) 0 x(k); 
      sin(phik) cos(phik) 0 y(k); 
      0 0 1 z(k); 
      0 0 0 1]; 
end 
qxx=ikine(robot,T) 
plot(robot,qxx) 

y=linspace(0.05,-0.05,N); % se mueve 0.10 unidades 
x=zeros(1,N); 
z=x; 
for j=1:N 
x(1,j)=0.702; 
z(1,j)=0.482; 
end 
phi=zeros(1,N); 
for k=1:length(y) 
phik=phi(k); 
T(:,:,k)=[cos(phik) -sin(phik) 0 x(k); 
      sin(phik) cos(phik) 0 y(k); 
      0 0 1 z(k); 
      0 0 0 1]; 
end 
qyy=ikine(robot,T) 
plot(robot,qyy)