执行for循环中的函数或循环展开时函数的不同行为

时间:2016-05-03 18:36:03

标签: matlab for-loop

我的功能出现了奇怪的行为,因为我不习惯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是否可能使用某些因某些原因在每次迭代结束时被删除的变量?

修改

- >"本地人"只是包含SCARA机器人应遵循的点的矩阵

- > fx是函数" Retta"它是以下

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 loop with for loop

已经生成两个图像重启Matlab

1 个答案:

答案 0 :(得分:3)

在最一般意义上解决问题(因为没有给出函数fx或函数/变量Punti的样本),那么你获得不同结果的原因可能就是状态当您测试一个案例与另一个案例时,您的变量/工作区是不同的。怎么会发生这种情况?以下是一些明显的方法......

  1. 你的函数(或者他们调用的其他函数)正在使用random number generator,当你测试循环与展开的循环情况时,RNG的起始状态是不同的。

  2. 您的函数正在共享全局变量,这些变量在每个测试用例开始时都不会重置为某个默认值。您在评论中提到函数使用全局变量,因此这可能是您的问题。

  3. Your functions aren't really functions, but scripts.脚本共享一个公共工作区(base workspace),而一个函数(特别是对函数的每次调用)都有自己独特的工作区。如果fx实际上是一个脚本,则每个调用可能会更改基本工作空间中的任何或所有变量。此外,任何其他脚本或您在命令行中输入的任何内容都可以更改内容。因此,在测试循环与展开的循环情况时,基础工作区的内容可能会有所不同。

  4. 如果我冒险猜测,我会说如果你在每个测试用例之前退出并重新启动MATLAB(即将所有内容重置为相同的默认启动状态),你可能会获得相同的结果循环与展开的循环情况。