2016-05-03 1 views
2

У меня есть странное поведение моих функций, и поскольку я не так привык к кодированию MATLAB, я думаю, это связано с чем-то очень легким, что я надеваю Не получишь.Выполнено различное поведение функции в цикле или при разворачивании цикла

Я не могу понять, как это может напечатать что-нибудь другое

fx(Punti(1,:),Punti(2,:)) 
fx(Punti(2,:),Punti(3,:)) 
fx(Punti(3,:),Punti(4,:)) 
fx(Punti(4,:),Punti(5,:)) 

из этого

for i_unic=1:4 
    fx(Punti(i_unic,:),Punti(i_unic+1,:)) 
end 

Рассмотрим FX в качестве обобщенной функции.

Возможно ли, что fx использует некоторые переменные, которые по какой-либо причине стираются в конце каждой итерации?

EDIT

-> "Punti" просто матрица, содержащая точки а SCARA робот должен следовать

-> FX функция "Ретта", и это следующий

function retta(PuntoA,PuntoB,Asse_A,q_ini,rot,contaerro,varargin) 
global SCARA40 
global inizio XX YY ZZ 
global seg_Nsteps 
     npassi  = seg_Nsteps; 
     ipuntofin = inizio + npassi; 
     for ipunto = inizio : ipuntofin 

     P4 = PuntoA + (ipunto-inizio)*(PuntoB-PuntoA)/npassi; 
     q  = kineinversa(Asse_A,P4,q_ini,rot); 
     Mec  = SCARA40.fkine(q); 
     Pec  = Mec(:,4); 
     if (dot((P4-Pec),(P4-Pec),3)>0.0001) 
      fprintf(1,'\n P4 Desid. = [%9.1f %9.1f %9.1f %9.1f ] \n',P4);   
      fprintf(1,'\n P4 Attuato = [%9.1f %9.1f %9.1f %9.1f ] \n',Pec); 
      contaerro = contaerro + 1; 
     else 
      q_ini = q; 
     end 
     SCARA40.plot(q); 
     XX(ipunto) = Pec(1); 
     YY(ipunto) = Pec(2); 
     ZZ(ipunto) = Pec(3); 
     if(nargin>6) 
      color = varargin{1}; 
     else 
      color = 'r'; 
     end 
     plot3(XX,YY,ZZ,color,'LineWidth',1); 
     drawnow; 
     hold on 
     end 
end 

функция тест с результатами

Punti  = [ 10,10,0,1 ;10,-10,0,1 ;-10,-10,0,1 ; -10,10,0,1 ] ; 

%inizio=1 
%retta(Punti(1,:)',Punti(2,:)',Asse_A,q_ini,rot,contaerro) 
%inizio=21 
%retta(Punti(2,:)',Punti(3,:)',Asse_A,q_ini,rot,contaerro) 
%inizio=41 
%retta(Punti(3,:)',Punti(4,:)',Asse_A,q_ini,rot,contaerro) 
%inizio=61 

inizio=1 
for i=1:length(Punti)-1 
retta(Punti(i,:)',Punti(i+1,:)',Asse_A,q_ini,rot,contaerro) 
inizio=inizio+20; 
end 

unfoalded loopwith for loop

двух изображений были получены перезапуском Matlab

+2

Настоящая причина невозможна, если вы не разместите код для 'fx' (а также для генерации' Punti'). –

+0

Я не могу опубликовать его, он слишком длинный, и никто его не читал. Шахта была теоретическим вопросом, а не связанным с кодом .. это было: «Вы можете найти причину, по которой функция будет вести себя двумя разными способами, если она находится в цикле for или если была выполнена безотказность цикла?» В любом случае он использует глобальные переменные и классы matlab, если эта информация может помочь. – GalloCedrone

+2

Если начальное состояние каждого из этих фрагментов точно такое же, не должно быть причин, по которым выводится что-то «другое». И не зная, как вы называете фрагменты или как используются глобалы и классы, я не могу дать вам больше информации, чем это. – TroyHaskin

ответ

3

Решение вопроса в самом общем смысле (так как нет образца приведены для функции fx или функции/переменной Punti), то причина, вы получаете разные результаты, вероятно, отличаются от состояния ваших переменных/рабочего пространства, когда вы проверяете один случай по сравнению с другим. Как такое могло произойти? Вот некоторые очевидные способы ...

  1. Ваши функции (или, возможно, другие функции, которые они называют) которые делают использование random number generator, и исходное состояние ГСЧ отличается при тестировании цикла по сравнению развернутом случае петли ,

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

  3. Your functions aren't really functions, but scripts. Сценарии имеют общую рабочую область (base workspace), тогда как функция (и, в частности, каждый вызов функции) будет иметь свое собственное уникальное рабочее пространство. Если fx фактически является скриптом, каждый вызов может изменить любые или все переменные в базовом рабочем пространстве. Кроме того, любые сценарии , или все, что вы вводите в командной строке, также могут изменить ситуацию. Поэтому содержимое базового рабочего пространства может отличаться, если вы проверяете цикл по отношению к разворачиваемому контуру.

Если бы я догадку, я бы сказал, что если бы вы были выйти и перезапустить MATLAB перед каждым тестом (т.е. сброс все в том же исходное состояние по умолчанию), вы, вероятно, получите точно такой же результат для цикла с развернутым циклом.

+0

Я не использую случайный генератор, я перезапустил matlab и я уверен, что это не скрипт .. :(Я отредактировал первый вопрос, я добавил изображения двух разных результатов, тестового примера и функции (я не знаю, полезно ли это, так как он полон вызовов к другой функции). Большое вам спасибо за помощь! Надеюсь, что редактирование прояснит проблему. – GalloCedrone

+0

Я нашел ошибку! Я увеличил переменную «inizio», поскольку она была локальной или не была написана функцией retta или каким-либо последующим вызовом, но это не дело! так inizio = 21, inizio = 41, ecc отличается от inizio = inizio + 20, ecc, потому что он был изменен некоторой внутренней функцией – GalloCedrone

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