MATLAB中用for循环真的太慢了,求优化下代码

img

img


以上就是我用的代码,才刚学没有多久,代码太不精简了,求帮忙修改一下。
自己尝试过不用syms,没有成功
h=37.71;l=10.65;
ra=150;rb=100;
c4 = 0; c3 = 0; c2 = 0; c1 = 0;
c5=56/(h^5);
c6=-140/(h^6);
c7=120/(h^7);
c8=-35/(h^8);
syms u;
sum=c1.(u+l).^1+c2.(u+l).^2+c3.(u+l).^3+c4.(u+l).^4+c5.(u+l).^5+c6.(u+l).^6+c7.(u+l).^7+c8.(u+l).^8;
kQ=1/ra+(1/rb-1/ra).*sum;
n=1.600;
DD=(n-1).kQ1000;
rQ=1./kQ;
U=int(kQ,0,u);
W=U./(sqrt(1-U.^2));
V=U./W;
O=int(W,0,u);
a=u-rQ.*U;
b=0;
c=rQ.V+O;
syms x y;
d=x-h/2+l;
g=(d+(y.^2+h^2/4)./d)./2;
P=sign(d);
u1=h/2-l+g-P.
((g.^2-h^2/4).^(1/2));
z=c-(rQ.^2-(x-a).^2-y.^2).^(1/2);
z=subs(z,u,u1);
digits(3);
z=vpa(z,2);
Z=[];
roundn(Z,2);
for X = 1:1:61
for Y = 1:1:61
Z(X,Y)=double(vpa(subs(z,{x,y},{X-31,Y-31})));
end
end
[X,Y]=meshgrid(X,Y);
mesh(X,Y,Z)

题主把代码粘贴一下,这样不好做和修改

matlab 本身就不快,对就行啦,本来就是仿真又不是实际应用,轻松点。Fortain比Matlab快

同二楼,把代码贴出来最好

  1. 向量化计算,MATLAB的优势是矩阵运算,所以能不写循环就不要写循环。

  2. 尽量调用系统函数,少用自己写的函数

  3. 预先申请内存,是因为如果不预分配的话,MATLAB在每次循环执行的时候都会改变数组a的大小,则每次都会去内存查找适合此大小的内存区间,然后重新分配内存。该过程不仅会造成MATLAB代码的执行速度变慢,而且很容易造成内存碎片化。

  4. 少用cell,cell的数组不需要连续的内存空间进行存储,所以需要记录每个cell单元的地址等信息,即使是空的cell单元,也会占用4个字节的存储空间。而且cell的访问是很慢的。

  5. 不管是在MATLAB还是C/C++中,都有一个准则叫:变勤拿少取为少拿多取。具体含义就是减小循环的次数,尽量在每次循环中做比较多的数据处理,不管是数据读取还是写入。因此,在编写带有嵌套循环的代码时,循环次数多的尽量在内层,少的尽量在外层。

  6. 逻辑索引比数值索引更快

  7. 赋值给类型不匹配的变量,比赋值给新定义的变量更慢。

  8. 如果要判断多个条件是否满足,尽量使用逻辑运算符 && 或者 || ,因为逻辑运算符只有在第一个逻辑条件成立的时候才会计算第二个逻辑条件[4]。

  9. 避免使用全局变量。

  10. 如果需要大段代码产生常值数据,可以考虑产生该数据,并保存在mat文件中,然后在运算中加载这些数据。

  11. 尽量使用m函数,替代m脚本。

  12. 尽量使用本地函数(local function)替代nested function。所谓本地函数,是指在同一个m文件中写了多个函数[5]。

  13. 模块化编程,尽量将长段代码分解为简单函数。长段代码中往往包含一些不常使用的代码段,分解之后可以降低处理器读取代码的时间。模块化编程可以降低首次运行时间。

  14. 避免使用eval,evalc,evalin,feval(fname),改为使用feval+函数句柄的方式。从文本间接调用函数比较耗时。

  15. 避免使用查询状态的函数,例如 inputname, which, whos, exist(var), dbstack, 这些函数比较耗时。

  16. 需大量运行且无法向量化的深度循环,考虑将之改为c语言函数。