向量化编程:arrayfun及cellfun函数的使用

时间:2022-03-27 21:21:13


arrayfun这个built-in函数来实现将任意函数应用到数组内包括结构在内的所有元素。这样很多以前不可避免的循环现在可以向量化了。而向量化正是Matlab不遗余力追求的核心思想之一。

举例一

生成一个这样的n*n矩阵aa(i,j)=dblquad(@(u,v) sin(u)*sqrt(v),0,i,0,j)(二重数值积分命令)。以n=10为例,可以这样做

%%%%%%%%%%

a=zeros(10);

for ii=1:10

  for jj=1:10

     a(ii,jj)=dblquad(@(u,v) sin(u)*sqrt(v),0,ii,0,jj);

end

end

%%%%%%%

采用更具效率的向量化编程如下

%%%%%

[J,I]=meshgrid(1:10);

a1=arrayfun(@(ii,jj) dblquad(@(u,v) sin(u)*sqrt(v),0,ii,0,jj),I,J);

%%%%%%

1A=ARRAYFUN(FUN, B)

FUN是函数句柄,对B中的每一个元素调用FUN函数(计算顺序随意),结果存放于A中,size(A)==size(B)

FUN函数可接受numeric, logical, char, struct, cell的自变量类型。

2[A, B, ...] = ARRAYFUN(FUN, C, ...)

FUN函数的返回值是一个向量,对B中的每一个元素调用FUN函数,计算结果放在A,B…中。

3A = ARRAYFUN(FUN, B, C,  ...)

FUN函数接受参数不唯一,分别调用B, C,  ...中的元素,A(i,j...)=Fun(B(i,j...),C(i,j,...)...)

B,C...大小必须相等。

例子2

quadl(@(x) arrayfun(@(xx) quadl(@(y) xx*y,sin(xx),cos(xx)),x),1,2)

这行代码体现了用MATLAB7.X求一般区域二重积分的一般方法。

 

Cellfun函数也有类似妙用。

function aa=sumsum(a)

aa=sum(sum(a));

 

>> b=zeros(2,2);

>> c=ones(3,3);

>> d={b,c}

 

d =

 

[2x2 double]    [3x3 double]

cellfun(@sumsum,d)

 

ans =

 

     0     9

 

By Juju Dec. 2010