MATLAB代码矢量化指南.docx

上传人:b****6 文档编号:3232594 上传时间:2022-11-20 格式:DOCX 页数:10 大小:22.50KB
下载 相关 举报
MATLAB代码矢量化指南.docx_第1页
第1页 / 共10页
MATLAB代码矢量化指南.docx_第2页
第2页 / 共10页
MATLAB代码矢量化指南.docx_第3页
第3页 / 共10页
MATLAB代码矢量化指南.docx_第4页
第4页 / 共10页
MATLAB代码矢量化指南.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

MATLAB代码矢量化指南.docx

《MATLAB代码矢量化指南.docx》由会员分享,可在线阅读,更多相关《MATLAB代码矢量化指南.docx(10页珍藏版)》请在冰豆网上搜索。

MATLAB代码矢量化指南.docx

MATLAB代码矢量化指南

“遵守PerformanceAcceleration的规则

    关于什么是“PerformanceAcceleration”请参阅matlab的帮助文件。

我只简要的将

其规则总结如下7条:

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

logical,char,int8,uint8,int16,uint16,int32,uint32,double而语句中如果使用了非以上的数据类型则不会加速,如:

numeric,cell,structure,single,functionhandle,javaclasses,userclasses,int64,uint64

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

3、当使用for循环时,只有遵守以下规则才会被加速:

a、for循环的范围只用标量值来表示;

b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数据类型,只使用三维以下的数组;c、循环内只调用了内建函数(build-infunction)。

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

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

即不要有这样的语句:

x=a.name;fork=1:

10000,sin(A(k)),end;

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

7、应该这样使用复常量x=7+2i,而不应该这样使用:

x=7+2*i,后者会降低运行速度。

“尽量用向量化的运算来代替循环操作。

如将下面的程序:

i=0;

fort=0:

.01:

10

   i=i+1;

   y(i)=sin(t);

end

替换为:

t=0:

.01:

10;

y=sin(t);

速度将会大大加快。

最常用的使用vectorizing技术的函数有:

All、diff、ipermute、permute、reshape、ueeze、y、find、logical、prod、shiftdim、sub2ind、cumsum、ind2sub、ndgrid、repmat、sort、sum等。

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

b、使用Functions而不是Scripts。

“绝招:

你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。

1、改用更有效的算法

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

关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:

“总结:

m文件转化为c/c++语言文件,VC编译”。

除了m程序提速的问题,这里还列出了《MATLAB代码矢量化指南(译)》

一、基本技术

-----------------------------------------------------

1)MATLAB索引或引用(MATLABIndexingorReferencing)

在MATLAB中有三种基本方法可以选取一个矩阵的子阵。

它们分别是下标法,线性法和逻辑法(subscripted,linear,andlogical)。

如果你已经熟悉这个内容,请跳过本节

1.1)下标法

非常简单,看几个例子就好。

A=6:

12;

A([3,5])

ans=

810

A([3:

2:

end])

ans=

81012

A=

[111417;

121518;

131619];

A(2:

3,2)

ans=

15

16

1.2)线性法

二维矩阵以列优先顺序可以线性展开,可以通过现行展开后的元素序号

来访问元素。

A=

[111417;

121518;

131619];

A(6)

ans=

16

A([3,1,8])

ans=

131118

A([3;1;8])

ans=

13

11

18

1.3)逻辑法

用一个和原矩阵具有相同尺寸的0-1矩阵,可以索引元素。

在某个位置上为1表示选取元素,否则不选。

得到的结果是一个向量。

A=6:

10;

A(logical([00101]))

ans=

810

A=

[12

34];

B=[1001];

A(logical(B))

ans=

14

-----------------------------------------------------

2)数组操作和矩阵操作(ArrayOperationsvs.MatrixOperations)

对矩阵的元素一个一个孤立进行的操作称作数组操作;而把矩阵视为一个整体进行的运算则成为矩阵操作。

MATLAB运算符*,/,\,^都是矩阵运算,而相应的数组操作则是.*,./,.\,.^

A=[10;01];

B=[01;10];

A*B%矩阵乘法

ans=

01

10

A.*B%A和B对应项相乘

ans=

00

00

------------------------------------------------------

3)布朗数组操作(BooleanArrayOperations)

对矩阵的比较运算是数组操作,也就是说,是对每个元素孤立进行的。

因此其结果就不是一个“真”或者“假”,而是一堆“真假”。

这个结果就是布朗数组。

D=[-0.21.01.53.0-1.04.23.14];

D>=0

ans=

0111011

如果想选出D中的正元素:

D=D(D>0)

D=

1.00001.50003.00004.20003.1400

除此之外,MATLAB运算中会出现NaN,Inf,-Inf。

对它们的比较参见下例

Inf==Inf返回真

Inf<1返回假

NaN==NaN返回假

同时,可以用isinf,isnan判断,用法可以顾名思义。

在比较两个矩阵大小时,矩阵必须具有相同的尺寸,否则会报错。

这是你用的上size和isequal,isequalwithequalnans(R13及以后)。

------------------------------------------------------

4)从向量构建矩阵(ConstructingMatricesfromVectors)

在MATLAB中创建常数矩阵非常简单,大家经常使用的是:

A=ones(5,5)*10

但你是否知道,这个乘法是不必要的?

A=10;

A=A(ones(5,5))

A=

1010101010

1010101010

1010101010

1010101010

1010101010

类似的例子还有:

v=(1:

5)';

n=3;

M=v(:

ones(n,1))

M=

111

222

333

444

555

事实上,上述过程还有一种更加容易理解的实现方法:

A=repmat(10,[55]);

M=repmat([1:

5]',[1,3]);

其中repmat的含义是把一个矩阵重复平铺,生成较大矩阵。

更多详细情况,参见函数repmat和meshgrid。

-----------------------------------------------------

5)相关函数列表(UtilityFunctions)

ones全1矩阵

zeros全0矩阵

reshape修改矩阵形状

repmat矩阵平铺

meshgrid3维plot需要用到的X-Y网格矩阵

ndgridn维plot需要用到的X-Y-Z...网格矩阵

filter一维数字滤波器,当数组元素前后相关时特别有用。

cumsum数组元素的逐步累计

cumprod数组元素的逐步累计

eye单位矩阵

diag生成对角矩阵或者求矩阵对角线

spdiags稀疏对角矩阵

gallery不同类型矩阵库

pascalPascal矩阵

hankelHankel矩阵

toeplitzToeplitz矩阵

==========================================================

二、扩充的例子

------------------------------------------------------

6)作用于两个向量的矩阵函数

假设我们要计算两个变量的函数F

F(x,y)=x*exp(-x^2-y^2)

我们有一系列x值,保存在x向量中,同时我们还有一系列y值。

我们要对向量x上的每个点和向量y上的每个点计算F值。

换句话说,我们要计算对于给定向量x和y的所确定的网格上的F值。

使用meshgrid,我们可以复制x和y来建立合适的输入向量。

然后

可以使用第2节中的方法来计算这个函数。

x=(-2:

.2:

2);

y=(-1.5:

.2:

1.5)';

[X,Y]=meshgrid(x,y);

F=X.*exp(-X.^2-Y.^2);

如果函数F具有某些性质,你甚至可以不用meshgrid,比如

F(x,y)=x*y,则可以直接用向量外积

x=(-2:

2);

y=(-1.5:

.5:

1.5);

x'*y

在用两个向量建立矩阵时,在有些情况下,稀疏矩阵可以更加有

效地利用存储空间,并实现有效的算法。

我们将在第8节中以一个

实例来进行更详细地讨论.

--------------------------------------------------------

7)排序、设置和计数(Ordering,Setting,andCountingOperations)

在迄今为止讨论过的例子中,对向量中一个元素的计算都是独立于同一向量的其他元素的。

但是,在许多应用中,你要做的计算则可能与其它元素密切相关。

例如,假设你用一个向量x来表示一个集合。

不观察向量的其他元素,你并不知道某个元素是不是一个冗余元素,并应该被去掉。

如何在不使用循环语句的情况下删除冗余元素,至少在现在,并不是一个明显可以解决的问题。

解决这类问题需要相当的智巧。

以下介绍一些可用的基本工具

max最大元素

min最小元素

sort递增排序

unique寻找集合中互异元素(去掉相同元素)

diff差分运算符[X

(2)-X

(1),X(3)-X

(2),...X(n)-X(n-1)]

find查找非零、非NaN元素的索引值

union集合并

intersect集合交

setdiff集合差

setxor集合异或

继续我们的实例,消除向量中的多余元素。

注意:

一旦向量排序后,任何多余的元素就是相邻的了。

同时,在任何相等的相邻元素在向量diff运算时变为零。

这是我们能够应用以下策略达到目的。

我们现在在已排

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1