arrayfun这个built-in函数来实现将任意函数应用到数组内包括结构在内的所有元素。这样很多以前不可避免的循环现在可以向量化了。而向量化正是Matlab不遗余力追求的核心思想之一。
举例一
生成一个这样的n*n矩阵a:a(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);
%%%%%%
1、A=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…中。
3、A = 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