如何让matlab全速运行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让matlab全速运行相关的知识,希望对你有一定的参考价值。
RT,我运行matlab的时候,用到FOR循环画图,发现CPU占有率始终不超过20%.
能不能让matlab把CPU全占了好快点算啊,FOR a=1:2:200 算了好多分钟
MATLAB中的变量在使用之前不需要明确地定义和指定维数。但当未预定义数组或矩阵的维数时,当需赋值的元素下标超出现有的维数时,MATLAB 就为该数组或矩阵扩维一次,这样就会大大降低程序的执行效率。因此,在使用数组或矩阵之前,预定义维数可以提高程序的执行效率。
2.对矩阵元素使用下标或者索引操作
在MATLAB中,矩阵元素的引用可用两个下标来表示。例如:A(i,j) 表示矩阵的第i行第j列的元素;A(1:k,j)表示矩阵A的第j列的前k个元素;A(:,j) 表示矩阵的第j列的所有元素。求矩阵A的第j列元素的平均值的表达式为mean(A(:,j))。
3.用函数代替脚本文件
因为每次调用MATLAB的脚本文件都需要将不必要的中间变量加载到内存中,每执行一次,就加载一次。函数在调用时被编译成了伪代码,只需要加载到内存一次。当多次调用同一个函数时会运行快一些。因此尽量多使用函数文件而少使用脚本文件,也是提高执行效率的一种方法。
4.用Mex文件编写循环代码
Matlab提供了与C和C++的接口,那么我们可以在用C或C++语言编写耗时的循环代码,然后通过接口程序在Matlab中转换成dll文件,这就是我们所要的Mex文件,可以在MATLAB环境下直接执行。通过这种方法可以极大地提高计算速率。一般来说,C-MEX 文件的执行速度是相同功能的M文件执行速率的20~40倍。
5.尽可能利用matlab内部提供的函数
因为matlab内部提供的函数绝对是各种问题的最优算法,那写程序都是他们大师级人物写出来的,程序应该说相当高效,有现成的为什么不用那!这个原则就不用实际的程序测试了。
6.给数组或矩阵预分配内存
特别是使用大型数组或矩阵时,Matlab进行动态内存分配和取消时,可能会产生内存碎片,这将导致大量闲置内存产生,预分配可通过提前给大型数据结构预约足够空间来避免这个问题。 参考技术A 如果你的电脑是多核的,可以使用
matlabpool open local n %这个n是你的cpu的核的数目
%%%%
%程序代码
%%%%
matlabpool close
for循环的话把for改成parfor就行本回答被提问者和网友采纳
【转载】让你的MATLAB运行效率更快一些吧!
参考技术A转自 https://www.digquant.com.cn/forum.php?mod=viewthread&tid=258
1、改变算法,多用矩阵运算(尤其是矩阵乘法),尽量减少for循环;
2、减少for循环中的函数调用;
传统观点认为for-loop是影响性能的致命环节,让我们来对此验证:
Elapsed time is 0.000239 seconds.
Elapsed time is 0.000050 seconds.
从上面的实验结果可以得出以下结论:
1、tic/toc语句的时间开销可以忽略不计
2、for-loop语句本身的时间开销也非常小,关键的影响效率的地方不在于循环本身,而是在于循环的内部。
3、tic/toc不一定要成对出现,一个tic后面可以有多个toc,但需要需要重新计时的时候,要再次执行tic。
4、toc的结果可以用变量接收下来,如:
接下来我们就借助for循环,分析一下其他的各个影响效率的因素。
内建函数
Mean elapsed time is 0.032866 seconds.
m-函数
Mean elapsed time is 0.185556 seconds.
匿名函数
Mean elapsed time is 0.561228 seconds.
内联函数
Mean elapsed time is 19.5606 seconds.
从上面的实验结果可以得出以下结论:
1、内联函数的调用时间开销最小,约为for-loop本身的10倍
2、m-函数的调用时间开销约为内联函数的6倍,约为for-loop本身的60倍
3、匿名函数的调用时间开销约为m-函数的3倍,约为for-loop本身的187倍
4、内联函数的调用时间开销过大,尽量不要在循环中使用
5、另外MEX-函数的调用时间开销,理应介于内联函数和m-函数之间
矩阵索引
Mean elapsed time is 0.007592 seconds.
Mean elapsed time is 0.007954 seconds.
Mean elapsed time is 0.663598 seconds.
Mean elapsed time is 0.273345 seconds.
Mean elapsed time is 0.730042 seconds.
Mean elapsed time is 1.00852 seconds.
Mean elapsed time is 0.009025 seconds.
Mean elapsed time > 20 minutes.
因此,如果不预先分配好内存,将会大大增加仿真时间,拖慢执行效率。
所幸的是,由于这个现象的重要性,Matlab的编辑器能够发现并提示这个问题,会用红的波浪线 ~ 标记出来。
向量化:
MATLAB向量化函数
accumarray函数
arrayfun函数
bsxfun函数
cellfun函数
spfun函数
A =
101
206
0
208
subs =
1 1 1
2 1 2
2 3 2
2 1 2
2 3 2
val =
101
102
103
104
105
1、val的元素个数与subs的行数是一致的。
2、 A = accumarray(subs, val) 的实现过程分成2步。
第一步
是把val中的元素,按照subs对应行所给出的下标放到一个新的cell矩阵B中(cell是为了方便解释,也就是说B矩阵中的每个位置可以放入多个数值),注意,subs的值是B的下标,不是val的。举例来说,subs第一行[ 1 1 1],意思就是把val中第一个元素(val(1))放入到B(1,1,1)的位置,依次类推,val(2)放入到B(2 1 2),val(3)放入到B(2 3 2),val(4)放入到B(2 1 2),val(5)放入到B(2 3 2)。此时,可以看到B(1,1,1)中有1个数(val(1));B(2 1 2)有2个数(val(2),val(4));B(2 3 2)也有2个数(val(3),val(5))。
第二步
把B中每个单元中的数分别累加,并放入到A的对应位置。
注: accumarray 默认的是把每个单元中的数累加,因为对每个单元中的数的默认处理函数是sum。可以通过 A = accumarray(subs,val,[],[@fun](https://github.com/fun "@fun")) 的调用格式来指定其他的处理函数,比如说mean。对指定的fun函数的要求是,接受列向量输入,输出单个的数值型,字符型或逻辑型变量。A的维数与B相同,A中的元素默认为零。A的大小为max(subs(1))×max(subs(2))×max(subs(3))…
很显然,A的维数与subs的列数相等。
例子:
1000人,身高分布在170 180cm,体重在110 100斤,年龄分布在20~50岁,计算身高体重都相等的人的年龄平均值。结果用矩阵来表示:行数表示身高,列数表示体重,矩阵元素表示年龄的平均值。
arrayfun函数实现的是将指定的函数应用到给定数组在内的所有元素。这样以前不可避免的循环现在可以向量化了。
生成一个这样的n×n矩阵
以前,当我们想对一个矩阵A的每一列或每一行与同一个向量a进行某些操作(比较大小、乘除等)时,只能用循环方法或者利用repmat函数将要操作的向量a复制成和A一样尺寸的矩阵,进而进行操作。从Matlab R2007a开始,有了更有效的方法,那就是bsxfun函数。
有如下矩阵:
向量为b=[1 2 3]T,请找出b在A矩阵列中的位置loc=[1,4]。
方法1:
方法2:
方法3:
方法4:
方法5:
A=‘Hello’, ‘MATLAB’, ‘I love MATLAB’, ‘MATLAB is powerful’, ‘MATLAB is the language of technical computer’;
cellfun( @length ,A)
ans =
5 6 13 18 44
</pre>
a =
(1,2) 1
(3,20) 2
(20,30) 3
(60,60) 4
(100,80) 5
</pre>
sa =
(1,2) 2
(3,20) 5
(20,30) 10
(60,60) 17
(100,80) 26
常用的预分配内存函数:
以上是关于如何让matlab全速运行的主要内容,如果未能解决你的问题,请参考以下文章