【发布时间】: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,真的应该没有区别。请尝试给出一个最小的工作示例,将其修剪以使效果仍然存在,然后立即发布整个代码。
-
理论上这是可能的。例如。您可以使用evalin 和
caller工作区在子函数中处理for 循环索引。可能还有其他方法,但除非您发布重现问题的最少代码,否则我们不会帮助您解决实际问题。很可能问题出在其他地方......