优化这行代码: %step7.重连接,以Pnew为父节点 for i = i:size(T.v,2)-1 dist = sqrt((Pnew(1) - T.v(i).x)^2 + (Pnew(2) - T.v(i).y)^2); if dist < r && i ~= minInd %计算当前点经过Pnew的代价,如果更小就更新 this_cost = dist + tmp_cost; if this_cost < T.v(i).cost %如果没有发生碰撞 this_p = [T.v(i).x,T.v(i).y]; if iscollision2(this_p,Pnew,dist,Img) continue; end T.v(i).cost = this_cost; T.v(i).xPre = Pnew(1); T.v(i).yPre = Pnew(2); T.v(i).indPre = k; end end end
时间: 2024-04-27 10:22:50 浏览: 103
同样可以使用向量化运算,将循环改为矩阵运算:
dis = sqrt((Pnew(1) - [T.v(:).x]').^2 + (Pnew(2) - [T.v(:).y]').^2);
valid_ind = find(dis < r & (1:length(T.v) ~= minInd));
for i = valid_ind
this_cost = dis(i) + tmp_cost;
if this_cost < T.v(i).cost
this_p = [T.v(i).x,T.v(i).y];
if iscollision2(this_p,Pnew,dis(i),Img)
continue;
end
T.v(i).cost = this_cost;
T.v(i).xPre = Pnew(1);
T.v(i).yPre = Pnew(2);
T.v(i).indPre = k;
end
end
这样可以使代码更加简洁高效。
相关问题
优化这行代码: %step5.父节点重选择,在给定半径里面选择父节dian for i = i:size(T.v,2) dist = sqrt((Pnew(1) - T.v(i).x)^2 + (Pnew(2) - T.v(i).y)^2); if dist <= r %处理在给定园范围里面的 this_cost = dist + T.v(i).cost; if this_cost < tmp_cost %判断是否有障碍物 this_p = [T.v(i).x,T.v(i).y]; if iscollision2(this_p,Pnew,dist,Img) continue; end tmp_cost = this_cost; minInd = i; end end end
同样可以使用向量化运算,将循环改为矩阵运算:
dis = sqrt((Pnew(1) - [T.v(:).x]').^2 + (Pnew(2) - [T.v(:).y]').^2);
valid_ind = find(dis <= r);
for i = valid_ind
this_cost = dis(i) + T.v(i).cost;
if this_cost < tmp_cost
this_p = [T.v(i).x,T.v(i).y];
if iscollision2(this_p,Pnew,dis(i),Img)
continue;
end
tmp_cost = this_cost;
minInd = i;
end
end
这样可以使代码更加简洁高效。
优化这行代码:%开始主循环 for iter = 1:MaxIter %step1.生成随机点 n = rand(); Prand = n < 0.5 ? [unifrnd(0,x_l),unifrnd(0,y_l)] : goal; end %step2.遍历树找到最近点 minDis = sqrt((Prand(1) - T.v(1).x)^2 + (Prand(2) - T.v(1).y)^2); minInd = 1; dis = sqrt((Prand(1) - [T.v(:).x]').^2 + (Prand(2) - [T.v(:).y]').^2); [minDis, minInd] = min(dis); end end %step3.扩展得到新节点 Pnew = [T.v(minInd).x,T.v(minInd).y] + step * ([Prand(1),Prand(2)] - [T.v(minInd).x,T.v(minInd).y]) / norm([Prand(1),Prand(2)] - [T.v(minInd).x,T.v(minInd).y]); tmp_cost = T.v(minInd).cost + step; % disp('befor check!'); %step4.检查是否碰撞 continue_flag = iscollision1(Pnear,Pnew,Pvec,Img); continue_flag = continue_flag ? continue : []; %step5.父节点重选择,在给定半径里面选择父节dian for i = i:size(T.v,2) dis = sqrt((Pnew(1) - [T.v(:).x]').^2 + (Pnew(2) - [T.v(:).y]').^2); valid_ind = find(dis <= r); for i = valid_ind this_cost = dis(i) + T.v(i).cost; if this_cost < tmp_cost this_p = [T.v(i).x,T.v(i).y]; if iscollision2(this_p,Pnew,dis(i),Img) continue; end tmp_cost = this_cost; minInd = i; end end end %step6.将Pnew插入到树中 T.v(end+1) = struct('x',Pnew(1),'y',Pnew(2),'xPre',T.v(minInd).x,'yPre',T.v(minInd).y,'cost',tmp_cost,'indPre',minInd); %画出生长出的树枝 plot([Pnew(2), T.v(minInd).y],[Pnew(1),T.v(minInd).x],'b','LineWidth',2); pause(0.01) %step7.重连接,以Pnew为父节点 for i = i:size(T.v,2)-1 dis = sqrt((Pnew(1) - [T.v(:).x]').^2 + (Pnew(2) - [T.v(:).y]').^2); valid_ind = find(dis < r & (1:length(T.v) ~= minInd)); for i = valid_ind this_cost = dis(i) + tmp_cost; if this_cost < T.v(i).cost this_p = [T.v(i).x,T.v(i).y]; if iscollision2(this_p,Pnew,dis(i),Img) continue; end T.v(i).cost = this_cost; T.v(i).xPre = Pnew(1); T.v(i).yPre = Pnew(2); T.v(i).indPre = k; end end end %step8.检查是否到达目标点附近 dis2goal = sqrt((Pnew(1) - goal(1))^2 + (Pnew(2) - goal(2))^2); flag = dis2goal < threshold; k = flag*(size(T.v,2) + 1); T.v(k).x = flaggoal(1); T.v(k).y = flaggoal(2); T.v(k).xPre = flagPnew(1); T.v(k).yPre = flagPnew(2); T.v(k).cost = flag*(T.v(k-1).cost + dis2goal); T.v(k).indPre = flag*(k - 1); if flag disp('find path!'); break; end
这段代码的主要问题在于有重复的循环变量名,导致后面的循环会覆盖前面的循环变量。建议将内部循环的变量名修改为其他名称,避免冲突。
另外,可以考虑使用向量化的方式来优化代码,减少循环次数,提高运行效率。例如,可以将一些循环中的操作改为矩阵运算或者向量化函数。
还有一些小细节可以优化,例如可以将一些常用的计算结果保存下来,避免重复计算,提高效率。
最后,建议在代码中加入注释,以方便理解和维护。
阅读全文