加速嵌套循环

28次浏览(最近30天)
马吉德
马吉德 2019年11月15日
评论道: 马吉德2019年12月15日
我试着加速这些回路,但我做不到。请帮助我。
这段代码之间最短的距离计算线路和直线的中点之间的距离以及它们之间的最小距离向量的点然后比较它与0,如果小于零,将beark第二个循环,改变新行和检查它的方向 所有 以前的线。我尝试了2000条线路和100条小径,PC花费了超过48小时。
n = 2000;
maxtrial = 100;
Rx =兰德(n, 1) * 0.2;
Ry =兰德(n, 1) * 0.2;
Rz =兰德(n, 1) * 0.2;
太= 0;
k = 1;
k < = n
创造用于纤维导引的天使
%为φ
Phi_min = -0.1745329;角的最小值
Phi_max = 0.1745329;角的最大值
φ= Phi_min +兰德(1,1)* (Phi_max-Phi_min);
%为θ
Z = (-1) + (1-(-1)) * rand(1,1);将Z的值用于角度,这将是在+- 10度
= acos (Z);
d1 =罪(θ)* sin(φ);
d2 =罪(θ)* cos(φ);
d3 = cos(θ);
%第一点coordinats
x2 = Rx (k) +(低频* 0.5 * d1);
y2 = Ry (k) +(低频* 0.5 * d2);
z2 = Rz (k) +(低频* 0.5 * d3);
%的第二点coordinats
x3 = Rx (k) -(低频* 0.5 * d1);
y3 = Ry (k) -(低频* 0.5 * d2);
z3 = Rz (k) -(低频* 0.5 * d3);
P = [x3-x2 y3-y2 z3-z2];%的方向向量
: P_all (k) = P;
如果k > = 2 & & k < = n
t = k - 1;
t = 1: k - 1
normal_vector =((交叉(P_all (k - t大灭绝,:),P_all (k,:)) /(规范(交叉(P_all (k - t大灭绝,:),P_all (k,:))))));垂直于两条直线的单位向量
min_distance =规范(点((R_all (k - t大灭绝,:)-R_all (k,:)), normal_vector)) df;%两条线之间的最小距离
L_ij =(-(点((R_all (k - t大灭绝,:)-R_all (k,:)), P_all (k - t大灭绝,:)))+(点((R_all (k - t大灭绝,:)-R_all (k,:)), P_all (k,:))) *点(P_all (k - t大灭绝,:),P_all (k,:))) /(1 -(点(P_all (k - t大灭绝,:),P_all (k,:))) ^ 2);直线中心与距离最小点之间的距离
如果min_distance < 0 & & L_ij < =低频/ 2
k = k - 1;
太= MT + 1;
打破
其他的
太= 0;
结束
结束
结束
如果太= = maxtrial
x2 = 0;
x3 = 0;
y2 = 0;
y3 = 0;
z2 = 0;
z3 = 0;
打破
结束
k: = [z2 x2 y2];%首点坐标矩阵
[z3 x3 y3] = [z3 x3 y3];%秒点坐标矩阵
k = k + 1;
结束
4评论
1月
1月 2019年11月23日
您已经在编辑器中看到了警告,这解释了迭代增长数组的缺点。以任何方式使用适当的预分配。
简单的代码不会运行得更快,但更容易阅读:Compare
Z = (-1) + (1-(-1)) * rand(1,1)
Z = 2 * rand - 1;
我不能运行你的代码,因为 f Df和R_all 是未定义的。看起来很奇怪,MT没有重置,比较MT==maxtrial只能匹配1次。
请发布运行代码。

登录评论。

接受的答案

1月
1月 2019年11月23日
编辑:1月 2019年11月23日
这一行很昂贵:
normal_vector =((交叉(P_all (k - t大灭绝,:),P_all (k,:)) /...
(规范(交叉(P_all (k - t大灭绝,:),P_all (k,:))))));
Matlab的 十字架() 效率不高 标准() 也可以加速。调用 十字架() 同样的数据重复两次也是浪费时间。 P_all (k,:) 是可用的 P 也。更快、更好的:
v = cross(P_all(k-t,:), P);
Normal_vector = v /范数(v);
或者使用更快的m函数:
normal_vector = NormCross(P_all(k-t,:), P);
函数c = NormCross(a, b)
C = [a(2) * b(3) - a(3) * b(2),...
A (3) * b(1) - A (1) * b(3)...
A (1) * b(2) - A (2) * b(1);
c = c /√(c c (1) * (1) + (2) * c (2) + (3) * c (3));
结束
同样的改进也可以应用于DOT命令。
顺便说一下:"normal_vector =("中的两个前导和后导括号只是降低了代码的可读性。
短期运行时测试:
P = rand(100,3);
t = 100;
抽搐
r = 1:1e5
k = 1:10 0
v =交叉(P (k,:), P (t):)) /规范(交叉(P (k,:), P (t):)));
结束
结束
toc
抽搐
r = 1:1e5
Pt = P(t,:);
k = 1:10 0
v = NormCross(P(k,:), Pt);
结束
结束
toc
%运行时间为11.122618秒。
%运行时间为2.686646秒。
只要不打电话就能快4倍 交叉 两次, 规范。
而不是比较 min_distance =规范(…) ,可以比较距离的平方来节省平方根的计算时间:
V = rand(1,3);
min_distance = norm(v) - Df;
如果min_distance < 0
...
结束
Df2 = Df ^ 2;
...
V = rand(1,3);
min_dist2 = v * v' - Df2;sum(v .* v)
如果min_dist2 < 0
...
结束
4评论
马吉德
马吉德 2019年12月15日
亲爱的简,
谢谢你的回答,当我设置n=2000和maxtrial=5的时候,它卡住了,花了48小时,没有完成。
我会跟随你的想法,非常感谢

登录评论。

更多的答案(0)

类别

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!