2013-05-05 477 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)