最近在网上查了一些资料,并结合自己的经验,就如何提高matlab计算效率,总结一下几个原则:
1. 提前给数组分配大小。
例如:在程序循环时用到数组变量 a ,若知道数组 a 的大小或者知道 a 的大小上界,则可以提前给数组a 分配大小。一般MATLAB也会给没有提前
分配大小的变量数组下面标示红线,提醒修改。
a=zeros(10,10)生成一个10行10列的零矩阵。
a=100*ones(10,10)生成一个10行10列的矩阵,并且每个元素都是100。
a=(1:10)生成一个从1到10的1行10列矩阵。
2. 尽量用矢量计算,减少 for 循环。
最近我也才意识到这一点,matlab自带的很多函数都支持矢量计算。直接矢量计算,避免大量的for循环。
用 min 函数举例:
clc
a=(1:1000000);
tic
for i=1:1000000
a(i)=min(a(i),100);
end
toc
tic
b=max(a,100);
toc
结果显示:
时间已过 0.028604 秒。
时间已过 0.006296 秒。
可见后者比前者的 for 循环快。
3. 尽量调用 maltab自带的函数来实现一些功能。
这个是显而易见的,matlab自带的函数由大神级的matlab开发人员所编写,他们当然会在计算速度上做不少优化,一定比我们编写的好。
4. 少用 find 函数,用 logical 替代。
查找替换矩阵中的元素,过去用 find 函数,现在用 logical 更好。
下面用一个例子,分别测试 for 循环,find函数,logical函数查找替换:
a=(1:10000000);
tic
for i=1:length(a)
if a(i)>5
a(i)=1;
end
end
toc
tic
a(find(a)>5)=1;
toc
tic
a(logical(a)>5)=1;
toc
结果显示:
时间已过 0.407840 秒。
时间已过 0.378585 秒。
时间已过 0.119918 秒
可见,find 函数仅仅比 for 循环快一点,而 logical 函数则显著快于它们。
5. 大规模的循环,可以调用 c语言或 C++来 计算。
这个见不少资料说,自己还没试过,有机会测试一下。