matlab编程提示,[转载]Matlab高效编程_常见程序错误提示

本文详细介绍了MATLAB编程中提升性能的规则,包括数据类型限制、数组维度、循环优化、条件语句使用、单行指令限制以及变量预分配等。此外,还强调了避免使用循环并提倡向量化运算、内建函数优先使用以及MEX-File的运用。对于R13之前的版本,MEX技术能显著提升程序速度,但在R14之后,MATLAB自身加速使得MEX的作用减弱。文章最后列举了一些常见的MATLAB错误及其解决方案。
摘要由CSDN通过智能技术生成

%%%%%%%%%%%%%%%

一、 遵守Performance Acceleration的规则

二、 遵守三条规则

三、 绝招

%%%%%%%%%%%%%%%%%

一、 遵守Performance Acceleration的规则

关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将

其规则总结如下7条:

1、只有使用以下数据类型,matlab才会对其加速:

logical,char,int8,uint8,int16,uint16,int32,uint32,double

而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu

re,single,

function handle,java classes,user classes,int64,uint64

2、matlab不会对超过三维的数组进行加速。

3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值

来表示;

b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数

据类型,只使用

三维以下的数组;c、循环内只调用了内建函数(build-in function)。

4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将

加速运行。

5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:

x = a.name; for k=1:10000, sin(A(k)), end;

6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速

度。

7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低

运行速度。

%%%%%%%%%%%%%%%%%%%%%%

二、 遵守三条规则

1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic

h means it is designed

for vector and matrix operations. You can often speed up your

M-file c

ode by using

vectorizing algorithms that take advantage of this design.

Vectorizati

on means converting

for and while loops to equivalent vector or matrix

operations.”。改进

这样的状况有两种方法:

a、尽量用向量化的运算来代替循环操作。如将下面的程序:

i=0;

for t = 0:.01:10

i = i+1;

y(i) = sin(t);

end

替换为:

t = 0:.01:10;

y = sin(t);

速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i

permute、permute、

reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums

um、ind2sub、

ndgrid、repmat、sort、sum 等。

请注意matlan文档中还有这样一句补充:“Before taking the time to

vectorize your code, read the section on Performance

Acceleration.

You may be able to

speed up your program by just as much using the MATLAB JIT

Accelera

tor instead of

vectorizing.”。何去何从,自己把握。

b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执

行循环次数少的,

内环执行循环次数多的。这样可以显著提高速度。

2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on

es、cell、struct、

repmat等。

b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:

A = uint8(zeros(100));

换成:

A = repmat(uint8(0), 100, 100);

c、当需要扩充一个变量的大小、维数时使用repmat函数。

3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。

b、使用Functions而不是Scripts 。

%%%%%%%%%%%%%%%%%%%%%%

三、 绝招

1、改用更有效的算法

2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。

关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++语言文件,VC编译”。

以上绝招是针对R13及以前版本的。从R14开始,Mathworks声称已经完成所有内建函数及工具箱的加速,Mex技术对提高程序运行速度已无用,其作用只是可以增强程序的可移植性而已。

我试验过,确实如此,有时甚至会出现转换后的函数运行速度反而变慢的现象!其他绝招还是有效的

1.Subscript indices must either be real positive integers or

logicals

中文解释:下标索引必须是正整数类型或者逻辑类型

出错原因:在访问矩阵(包括向量、二维矩阵、多维数组,下同)的过程中,下标索引要么从 0 开始,要么出现了负数。注:matlab

的语法规定矩阵的索引从 1 开始,这与 C 等编程语言的习惯不一样。

解决办法:自己调试一下程序,把下标为 0 或者负数的地方修正。

2.Undefined function or variable "a"

中文解释:函数或变量 a 没有定义

3.Input argument "x" is undefined

中文解释:输入变量 x 没有定义

4.Matrix dimensions must agree

Inner matrix dimensions must agree

中文解释:矩阵的维数必须一致

出错原因:这是由于运算符(= + - / * 等)两边的运算对象维数不匹配造成的,典型的出错原因是错用了矩阵运算符。matlab

通过“.”来区分矩阵运算和元素运算

5.Function definitions are not permitted at the prompt or in

scripts

中文解释:不能在命令窗口或者脚本文件中定义函数

出错原因:一旦在命令窗口写 function c = myPlus(a,b),此错误就会出现,因为函数只能定义在 m 文件中

6. 1) X must have one or two columns

2)Vectors must be the same

lengths

中文解释:

1. X 必须是 1 或者 2 列

2. 向量长度必须一致

7.One or more output arguments not assigned during call to

'...'

中文解释:在调用...函数过程中,一个或多个输出变量没有被赋值

8.??? Error using ==> mpower

Matrix must be square

中文解释:错误使用mpwoer函数,要求矩阵必须是方阵

9.Explicit integral could not be found.

中文解释:显式解没有找到

10.Index exceeds matrix dimensions.

Attempted to access b(3,2); index out of bounds because

size(b)=[2,2].

中文解释:索引超出矩阵的范围

11.In an assignment A(I) =

B, the number of elements in B and I must be the same

中文解释:在赋值语句 A(I) = B 中,B 和 I 的元素个数必须相同

12.To RESHAPE the number of elements must not change

中文解释:矩阵变换时,变换前和变换后的总元素不能改变

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值