2013-05-05 1 views
-2

У меня эта проблема в Matlab: максимальный предел рекурсии 500 достигнут, поскольку одна из функций называется много. Это действительно расстраивает. Об этой проблеме много в Интернете. Но я выглядел очень хорошо, и нет единственного реального решения этой проблемы. Даже увеличение предела рекурсии с использованием set (0, «RecursionLimit», N) не помогает, потому что после того, как я это сделаю и запустил свой код, Matlab сработает (и он сработает для любого значения N Ii put)Максимальный предел рекурсии 500 достигнут Ошибка

FYI, мой код должен вызывать одну из функций более 500 раз, поэтому в этом нет ничего плохого. Итак, есть ли способ увеличить предел рекурсии на Matlab (без его срыва) или лучше сделать это без ограничений?

+0

могли бы Вы опубликовать код или имя функции, которая рекурсивно в 500 раз? –

ответ

0

Вы можете попробовать увеличить размер стека, используемый MATLAB, так как рекурсия обычно ломается после того, как стек заполнен.

Примите к сведению, что существует принципиальная разница между функцией, которая вызывается 500 раз и функция, которая 500 рекурсивно раз. В MATLAB последнее довольно редко. Вы уверены, что вам нужна эта рекурсия?

+0

@woodchips ....Я знаю, что нормально смотреть этот файл более 500 раз, потому что так работает алгоритм (читайте про перечисление Pohst, если вы заинтересованы Это не ошибка bcoz, когда стек заполняется! Эта ошибка возникает bcoz matlab предполагает, что она застряла в цикле ... пока это не Эта ошибка не встречается на C или Java .... В любом случае .... Большое спасибо ребятам ... похоже, мне нужно написать мой cood используя циклы вместо вызывающие файлы – user2329321

+0

@ user2329321 - зачем отвечать на этот ответ, а не тот, который я дал? Во всяком случае, не утверждайте, что код делает что-то нормальное. Тот факт, что проблема возникает, означает, что есть проблема. спорить с компьютером. МОЖЕТЕ означать, что ваш код ошибочно реализован. Это может означать, что ваш выбор реализации плох. – 2013-05-07 02:35:46

+0

@woodchips .... Извините, я ответил здесь. Я спешил и не заметил где я был типирование. В любом случае, я действительно не понимаю, почему вы настаиваете на своем. Опять же, прочитайте про алгоритм перечисления Pohst, чтобы понять, почему это нормально. И, кстати, я снова реализовал алгоритм, и одна и та же часть все еще выполняется более чем 500 раз, и я не получаю эту ошибку. Единственное различие заключается в том, что я написал код на этот раз с вложенными циклами вместо вызова кодов в других файлах, что, конечно, немного сложнее. В любом случае, спасибо за помощь и информативную обратную связь. – user2329321

1

Чтобы сказать, что НИЧЕГО НЕПРАВИЛЬНО с 500-кратной рекурсией, может быть неправильно само по себе.

Проблема с рекурсией заключается в том, что MATLAB должен настраивать отдельные рабочие области каждый раз, когда вызывается функция, создавая их стек. Это может быть довольно неэффективным, используя достаточное количество времени, а также память. Так что может быть что-то не так с тем, что вы делаете.

Также очень часто я видел, что рекурсивные функции могут быть переписаны как НЕ рекурсивные. Методы, такие как memoization, могут использоваться, чтобы избежать рекурсивной оценки функции на одних и тех же входах много раз. Почему одни и те же вычисления более одного раза?

Вы можете изменить ограничения на размер стека, но очень часто эти ограничения вполне разумны и помещаются там, чтобы предотвратить проблемы памяти и времени. Таким образом, вам гораздо лучше смотреть серьезно на свой код, чтобы решить, подходит ли такое изменение, а не переформулировать вашу проблему.

Например, вы можете вычислить факториалы, используя рекурсию, но зачем беспокоиться? Это очень глупое решение, когда простой цикл намного эффективнее. Накладные расходы намного больше, чем вы хотите потратить, когда цикл является достаточным для проблемы.

Другим примером является последовательность Фибоначчи. Его можно записать рекурсивно, что легко сделать, но это не делает его вообще хорошим делом. Вычисляемый полностью рекурсивно, n-й номер Фибоначчи потребует экспоненциального времени и памяти для вычисления F (n). Петли лучше, что позволяет выполнять O (n) объем работы. Еще лучше, что схемы memoization, связанные с правильными тождествами, позволяют вычислять F (n) в O (log2 (n)) времени.

Дело в том, что вы можете решить множество проблем с рекурсией, но это не значит, что это правильный способ сделать это.

+0

«Например, вы можете вычислить факториалы, используя рекурсию, но зачем беспокоиться? Это очень глупое решение, когда простой цикл намного эффективнее». – WorBlux

1

Проблемы: Максимальный предел рекурсии 500 достигнут. Используйте set (0, 'RecursionLimit', N), чтобы изменить предел. Be осознает, что превышение допустимого пространства стека может привести к сбою 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) 

 Смежные вопросы

  • Нет связанных вопросов^_^