如果我们只求出其中前有限项,比如 100,000 项之和 (要精确地求出级数的和,无需求 100000
项,几十项往往就能得出满意的精度。这里主要是为了演示循环运算向量化的优越性。),则可以采用下面的常规语句进行计算
>> tic, s=0;
for i=1:100000, s=s+(1/2^i+1/3^i); end, s,toc
s =
1.5000
elapsed_time =
1.9700
如果采用向量化的方法,则可以得出下面结果。可以看出,采取向量化的方法比常规循环运算效率要高得多。
>> tic, i=1:100000;
s=sum(1./2.^i+1./3.^i), toc
s =
1.5000
elapsed_time =
0.3800
(2)在必须使用多重循环的情况下,如果两个循环执行的次数不同,则建议在循环的外环执行循环次数少的,内环执行循环次数多的。这样也可以显著提高速度。
〖例3.20〗考虑生成一个 5x10000 的 Hilbert 长方矩阵,该矩阵的定义是其第 i 行第 j 列元素为
h_{i,j}=1/(i+j-1)。我们可以由下面语句比较先进行 i=1:5
的循环和后进行该循环的耗时区别,其效果和前面分析的是一致的。
>> tic
for i=1:5
for j=1:10000
H(i,j)=1/(i+j-1);
end
end
toc
elapsed_time =
8.6800
>> tic,
for j=1:10000
for i=1:5
J(i,j)=1/(i+j-1);
end
end
toc
elapsed_time =
25.7000
大型矩阵的预先定维
给大型矩阵动态地定维是个很费时间的事。建议在定义大矩阵时,首先用 MATLAB 的内在函数,如zeros() 或 ones()
对之先进行定维,然后再进行赋值处理,这样会显著减少所需的时间的。
再考虑例 3-20 中的问题,如果输入下面的命令
>> tic
H=zeros(5,10000);
for i=1:5
for j=1:10000
H(i,j)=1/(i+j-1);
end
end
toc
elapsed_time =
1.0400
则采用预先定维的方法,再结合向量化的方法,我们可以给出下面的 MATLAB 语句。
>> tic
H=zeros(5,10000);
for i=1:5
H(i,
=1./[i:i+9999];
end
toc
elapsed_time =
0.060
可见,预先定维后,所需要的时间显著地减少了。可以看出,同样一个问题,由于采用了有效的措施,所需的时间就可以从 25.7 秒减少到
0.06 秒,亦即效率提高了 428 倍。
对二重循环这样的特殊问题,我们还可以使用 meshgrid() 函数构造两个 5x10000 矩阵 i 和 j,从而直接得出 H
矩阵,更进一步地加快速度。
>> tic, [i,j]=meshgrid(1:5,1:10000);
H=1./(i+j-1); toc
elapsed_time =
0
优先考虑内在函数
矩阵运算应该尽量采用 MATLAB 的内在函数,因为内在函数是由更底层的编程语言 C
构造的,其执行速度显然快于使用循环的矩阵运算。
采用有效的算法
在实际应用中,解决同样的数学问题经常有各种各样的算法。例如求解定积分的数值解法在 MATLAB
中就提供了两个函数 quad() 和
quad8(),其中后一个算法在精度、速度上都明显高于前一种方法。所以说,在科学计算领域是存在“多快好省”的途径的。如果一个方法不能满足要求,可以尝试其他的方法。
应用 Mex 技术
虽然采用了很多措施,但执行速度仍然很慢,比如说耗时的循环是不可避免的,这样就应该考虑用其他语言,如 C 或 Fortran 语言。按照
Mex 技术要求的格式编写相应部分的程序,然后通过编译联接,形成在 MATLAB 可以直接调用的动态连接库 (DLL)
文件,这样可以显著地加快运算速度。有关 Mex 技术及其应用的详细内容可参见第 7 章。
此外还有一段国外的Maximizing MATLAB Performance
介绍怎样优化加速matlab运算,自己查一下,需要练习才能掌握。
Maximizing MATLAB Performance This chapter describes techniques
that often improve the execution speed and memory management of
MATLAB code. It covers the following topics:
1.Techniques for Improving Performance. How to improve M-file
performance by vectorizing loops, preallocating arrays, etc.
2.Performance Acceleration. Some M-file coding practices to use,
and some to avoid, in getting the best performance out of
MATLAB.
3.Sample Accelerated ProgramsSample. M-file programs written to
maximize MATLAB code acceleration
4.Measuring PerformanceUsing the MATLAB Profiler utility to tune
your programs for optimal performance.
5. Making Efficient Use of MemoryConserving memory;
platform-specific memory handling, "Out of Memory" errors.