【问题标题】:Different behaviour of function in a for-loop or when unrolling of the loop is performedfor循环中或执行循环展开时函数的不同行为
【发布时间】:2016-05-03 18:36:03
【问题描述】:

我的函数有一个奇怪的行为,因为我不太习惯 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 使用了一些在每次迭代结束时由于某种原因被删除的变量?

编辑

-->“Punti”只是包含 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

重启matlab生成两张图片

【问题讨论】:

  • 如果不发布fx(以及Punti一代)的代码,就不可能找出真正的原因。
  • 我不能发,太长了没人看。我的问题是一个理论问题,与代码无关。它是:“如果一个函数在 for 循环中或者如果循环的 unrorring 已经执行,你能找到为什么一个函数会以两种不同的方式运行的原因吗?”无论如何,如果这些信息有帮助,它会使用全局变量和 matlab 类。
  • 如果每个 sn-ps 的起始状态完全相同,则应该没有理由输出“不同”的东西。在不知道您如何调用 sn-ps 或如何使用全局变量和类的情况下,我无法提供更多信息。
  • 我认为您在其他地方遇到了另一个错误。因为IMO,真的应该没有区别。请尝试给出一个最小的工作示例,将其修剪以使效果仍然存在,然后立即发布整个代码。
  • 理论上可能的。例如。您可以使用evalincaller 工作区在子函数中处理for 循环索引。可能还有其他方法,但除非您发布重现问题的最少代码,否则我们不会帮助您解决实际问题。很可能问题出在其他地方......

标签: matlab for-loop


【解决方案1】:

从最一般的意义上解决问题(因为没有为函数fx 或函数/变量Punti 提供样本),那么您得到不同结果的原因可能是您的变量/当您测试一个案例与另一个案例时,工作空间是不同的。这怎么可能发生?这里有一些明显的方法...

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

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

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

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

【讨论】:

  • 我没有使用任何随机生成器,我重新启动了 matlab,我确定它不是脚本.. :( 我编辑了第一个问题,我添加了两个不同结果的图片,测试用例和功能(我不知道它是否有帮助,因为它充满了对其他功能的调用)。非常感谢您的帮助!希望编辑澄清问题
  • 我发现了错误!我增加了变量“inizio”,因为它是本地的,或者不是由函数 retta 或后续调用编写的,但事实并非如此!所以 inizio = 21, inizio=41, ecc 与 inizio=inizio+20, ecc 不同,因为它被一些内部函数修改了
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多