达到的最大递归限制为500错误

时间:2013-05-05 21:27:29

标签: matlab matrix simulation mathematical-optimization

我在Matlab中遇到这个问题:因为其中一个函数被调用很多,所以达到的最大递归限制为500。这真令人沮丧。网上有很多关于这个问题的问题。但我看起来很好,并没有一个真正的解决方案来解决这个问题。即使使用set(0,'RecursionLimit',N)增加递归限制也无济于事,因为在我这样做并运行我的代码之后,Matlab崩溃了(并且它崩溃了任何值N Ii put)

仅供参考,我的代码应该以超过500次的方式调用其中一个函数,因此它没有任何问题。那么有没有办法在Matlab上增加递归限制(没有崩溃)或更好地使它没有限制?

3 个答案:

答案 0 :(得分:1)

要说500次递归没有错,本身可能是错误的。

递归的问题是MATLAB必须在每次调用函数时设置单独的工作空间,从而构建它们的堆栈。这可能效率很低,耗费了大量的时间和内存。所以你正在做的事情可能有问题。

同样,我经常看到递归函数可以重写为非递归函数。可以采用诸如记忆的技术来避免在相同输入上递归地多次递归地评估函数。为什么不止一次进行相同的计算?

您可以更改堆栈大小的限制,但通常这些限制是非常合理的,并且放在那里以防止内存和时间问题。所以你最好不要认真考虑你的代码来决定这样的改变是否合适而不是重新制定你的问题。

例如,您可以使用递归计算阶乘,但为什么要这么麻烦?当一个简单的循环效率更高时,这是一个非常愚蠢的解决方案。当一个循环足以解决问题时,堆栈的开销远远超过你想要的开销。

另一个例子是Fibonacci序列。它可以递归编写,这是一件容易的事情,但这并不能使它成为一件好事。完全递归地计算,第n个斐波那契数将需要指数时间和存储器来计算F(n)。循环更好,允许你做O(n)量的工作。更好的是,伴随着正确身份的记忆方案允许在O(log2(n))时间内计算F(n)。

关键是,你可以通过递归来解决许多问题,但这并不意味着这是正确的方法。

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

答案 2 :(得分:0)

您可以尝试增加MATLAB使用的堆栈大小,因为一旦堆栈已满,递归通常就会中断。

请注意,被调用 500次的函数与 recurses 500次的函数之间存在根本区别。在MATLAB中,后者非常罕见。你确定需要这种递归吗?