matlab程序的优化,目前的程序运行时间太长了 求大神帮忙加快速度

matlab程序的优化,目前的程序运行时间太长了 求大神帮忙加快速度,第1张

k=2pi/(532e-9);

z=01;

m=2;

l=1;

theta=0;

r0=0005;

nnx=256;

xx=-0005:001/255:0005;

yy=-0005:001/255:0005;

%{

for nn=1:nnx

for mm=1:nnx

phi=atan2(yy(mm), xx(nn));

rho=sqrt(yy(mm)^2+xx(nn)^2);

f1(nn,mm)=quad(@(r)rexp(-01ikr^15)ki^(m+2)besselj(m,-krhor/z)sin(mphi+2pi(r/r0)^l+theta),0,r0);

f2(nn,mm)=quad(@(r)rexp(-01ikr^15)ki^(m+2)besselj(m,-krhor/z)cos(mphi+2pi(r/r0)^l+theta),0,r0);

end

end

%}

phi=atan2(yy', xx');

rho=sqrt(yy^2+xx^2);

f1=integral(@(r)rexp(-011ikr^15)k1i^(m+2)besselj(m,-krho'r/z)sin(mphi+2pi(r/r0)^l+theta),0,r0,'ArrayValued',true);

f2=integral(@(r)rexp(-011ikr^15)k1i^(m+2)besselj(m,-krho'r/z)cos(mphi+2pi(r/r0)^l+theta),0,r0,'ArrayValued',true);

f1'

f2'

1在使用数组或矩阵之前先定义维数

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进行动态内存分配和取消时,可能会产生内存碎片,这将导致大量闲置内存产生,预分配可通过提前给大型数据结构预约足够空间来避免这个问题。

首先介绍一下我自己使用的有效方法,一般matlab启动初始化很慢主要的原因是在找注册文件,一般是由于安装了MAC类的软件引起的,所以我按照下文提供的方法“在目标中,键入如下内容”$MATLAB\bin\win32\MATLABexe” -c “<Full Path to the MATLAB license file including file name>””,我在快捷方式里面目标路径中键入:"C:\Program Files\MATLAB\R2009b\bin\win32\MATLABexe" -c "C:\Program Files\MATLAB\R2009b\bin\win32\lic_standalonedat",即解决了这个问题,感谢网友无私的分享精神。注意上面路径中lic_standalonedat是自己的许可文件,换换就可以了!

Matlab随着版本的升级体积越来越大,带来的问题就是启动速度也越来越慢,下面就我注意到的几个影响MATLAB启动速度的问题集中和大家分析下解决办法。

一、preferences方面原因

问题产生原因:

大家都知道,preferences参数很多,如果首选参数设置的不得当,或者文件太大,Matlab启动的时候加载preferences设置就需要较长时间

问题解决方法:

以管理员权限登录,以保证自己有查看隐藏文件的权限。

windows

(1)退出Matlab,一定要确保Matlab不再运行

(2)进入c:\Documents and Settings\ <your username>\Application Data\MathWorks\MATLAB\ 复制代码真实该路径可以在Matlab中键入prefdir得到

(3)将上述路径中,以Matlab版本号为文件名(比如R2009a)的文件夹,重命名为R2009a_old(其实这一步是在备份preferences文件)

(4)重启Matlab,此时predir下会重新创建一个R2009a文件夹,里面包含了所有的preferences设置,只是属性值都是默认的,当然以前对Matlab的设置全部没有了

(5)如果觉得不满意,那么将新生成的R2009a删除,将R2009a_old重新改为R2009a就可以恢复以前的设置了。

Linux, Unix, or Mac

1) Quit MATLAB Ensure that MATLAB is no longer running

2) Rename the “matlab/” directory in the users home directory, to “matlab_old/”

3) Restart MATLAB

二、License方面原因

问题产生原因:

每次Matlab启动的时候会自动搜索Matlab的License文件,而计算机系统变量LM_LICENSE_FILE,则是用来告诉所有的应用程序从哪里找到对应的License文件

另外系统变量LM_LICENSE_FILE也可能导致初始化很慢,但是该变量只对Matlab负责,LM_LICENSE_FILE是对所有的程序负责

但是假如你的Matlab使用的是网络版的License,你计算机没有联网就会导致无法找到network license

解决方法:

方法一

windows

(1)右击我的电脑选择属性

(2)在高级选项卡中,点击环境变量

(3)在下面的系统变量找到LM_LICENSE_FILE,如果没有,点击新建创建一个变量名为LM_LICENSE_FILE的变量

(4)将LM_LICENSE_FILE的属性值设置为Maltab的License文件的绝对路径

(5)重启Matlab

Unix,Linux,or Mac

Check to see if there is an environment variable set Where this is located depends on the shell you are using Look in your home folder This file may be called: cshrc (c-shell), profile (bash), or bashrc (bash)

You can also create an environment variable for that shell session from the command line using export or setenv (depending on your shell), but the above file needs to be edited for a permanent change

For example:export MLM_LICENSE_FILE /usr/bin/matlab/licensedat

如果你只有一个License,那么你可以当Matlab启动的时候,在Maltab快捷方式或者命令行中指定License路径

windows

(1)右击Matlab快捷方式,选择属性

(2)在目标中,键入如下内容”$MATLAB\bin\win32\MATLABexe” -c “<Full Path to the MATLAB license file including file name>”

复制代码其中$MATLAB是Matlab安装根目录,可以在Matlab中键入matlabroot得到,<Path to the MATLAB license file>是License文件的绝对路径

(3)重启Matlab

Unix,Linux,or Mac

Use a -c switch to point directly at the license file when launching

If the MATLAB installer has created symbolic links, runmatlab -c <Full Path to the MATLAB license file including file name>

If symbolic links were not created, run from $MATLAB/bin//matlab -c <Full Path to the MATLAB license file including file name>

Where $MATLAB is the root MATLAB directory and <Path to the MATLAB license file> is the absolute path to your license file, likely in your $MATLAB/licenses directory

你这个程序按说是没法运行的,程序中的intrans不是matlab的函数,如是自写的,只要有,也可能运行。去掉这句后,再改一处,

[B,A] = butter(10, 02, 'low');

RGB=im2double(RGB);

rgb = filter(B, A, RGB);

RGB=im2double(rgb);

%RGB=im2double(RGB);

运行起来,并不慢。

第一步:首先打开MATLAB命令窗口,输入matlabpool open ,或者把这句加入程序开头。

第二步:主要是两种:parfor模式和spmd模式。两种模式的应用都很简单。

parfor其实就是parallel+for简化而来,就是把原来程序中的for循环中的关键字for改为parfor就行。

spmd 自己help就会了。

附上附件,附件运行图如下:

根据我的一些经验和相关的参考资料,要想提高其运算的速度,以下的方法可以试一下:

(1)尽可能地用向量化的数组运算代替循环,尽可能地减少使用户for或while循环,这是因为matlab执行循环运算效率很低而数组运算效率较高。举个最经典的例子,下面的循环:

k=0;

for t=0:pi/20:2pi;

k=k+1;

y(k)=cos(t);end;

就可以用t=0:pi/20:2pi;y=cos(t)代替,这样即减少代码量又能提高运算速度

(2)如果非要用循环的话尽可能进行循环内数组的预配置而不是让程序在循环中不断地动态配置,好比像C语言中要想使用数组必须先定义数组的长度一样,比如说如果想要做以下的循环:

k=0;

for t=1:1:20;

k=k+1;

y(k)=t^2;end;

可以事先定义y=linspace(0,0,20)即定义y为一个拥有20个0的一维数组,这样就相当于是事先对循环内的数组进行了预配置;

(3)尽可能采用MATLAB自带的函数指令,这些函数都是一些很经典的算法构成的,比如说要想找最大值就应用函数max而不是自己去编程序,这样只会事倍功半;

(4)尽量采用M函数文件替代M的脚本文件,因为函数文件运行时是采用P码方式驻留在内存中而不是像脚本文件一样每运行一次都要经历把程序装入内存的过程,因而比较省时;

(5)在循环比较费时的时候可以考虑采用非解释执行的MEX文件来对此进行表达;

(6)尽可能找出导致程序运行缓慢的瓶颈,可以在MATLAB的View:profiler中打开程序剖析器找出程序运行中的瓶颈,具体使用的方法请参考MATLAB的帮助或者在网上寻找;

(7)从硬件来看电脑的CPU或者内存(不是大小而是读写速度)可能会是瓶颈,在做大型运算时可以考虑较好的配置。

希望对你有所帮助!

matlab对多层嵌套循环的执行效率非常低,远远低于c++代码,通常使用三层的嵌套循环就要慎重,你的代码有四层循环了。解决方案有如下几个:1)考虑采用向量化编程,但实际编码时不是所有的都可以以向量化的方式改写,编码也有一定难度;2)考虑采用c++混编,把嵌套循环的代码由c++实现,再让matlab调用这部分功能;3)选用高版本的matlab,如r2016a,新版本对于嵌套循环的执行效率会有1/3以上的提升。

以上就是关于matlab程序的优化,目前的程序运行时间太长了 求大神帮忙加快速度全部的内容,包括:matlab程序的优化,目前的程序运行时间太长了 求大神帮忙加快速度、如何让matlab全速运行、linux下 命令行执行matlab速度很慢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10113025.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存