MatLab 向量化技巧

家家 @ 2007-05-17 13:53

大家都知道MatLab是一种解释性语言,它的长处在矩阵运算。

因此需要将问题尽量用矩阵表示,并且要避免对单个矩阵元素操作,

而用整体矩阵运算。一个重要过程就是所谓将问题矢量化(vectorizing)。

一个问题是如果需要对矩阵的不同元素作不同操作,那么怎么办?举个例子

对矩阵X,作A=5*sin(X)/X,显然当X某元素->0时,A对应元素->5。按照

通常在其他语言思路编程为:

Nx=2000;

X=2.0*pi*(rand(Nx,Nx)-0.5);

X(1:Nx/2,:)=0.0; %生成Nx X Nx矩阵X,一半为随机分布,一半为0。

A=zeros(Nx,Nx);

for m=1:Nx

for n=1:Nx

if(abs(X(m,n))>=eps)

A(m,n)=5.0.*sin(X(m,n))./X(m,n);

else

A(m,n)=5.0;

end

end

end %(ProgramNo.1)

以上代码通过循环语句对每一个矩阵元素进行单独操作,这段代码在MatLab里效 率特别低。为避免循环,考虑如下方法:

方法I:用所谓logical subscripting。

Nx=2000;

X=2.0*pi*(rand(Nx,Nx)-0.5);

X(1:Nx/2,:)=0.0;

A=zeros(Nx,Nx);

I=(abs(X)>=eps);

A=I.*5.0.*sin(X)./(X+(1-I))+(1-I).*5.0; %(ProgramNo.2)

或者上面最后一行用如下代码代替:

A(I)=5.0.*sin(X(I))./X(I);

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐