matlab usage: cellfun
2016-05-02 18:54
435 查看
举个简单的例子,比较下下面两段代码
A = {'ab','abc','abcd'};
l = cellfun(@(x)length(x),A)
-------------------------------------------
A = {'ab','abc','abcd'};
l2 = zeros(1,3);
for k = 1:length(A)
l2(k) = length(A{k});
end
-----------------------------------------
向量化编程:arrayfun及cellfun函数的使用
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);
forii=1:10
forjj=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函数也有类似妙用。
example1:
functionaa=sumsum(a)
aa=sum(sum(a));
>>b=zeros(2,2);
>>c=ones(3,3);
>>d={b,c}
d =
[2x2double] [3x3 double]
cellfun(@sumsum,d)
ans=
0 9
example2:
CELLFUN Apply a function to each cell of a cell array.
a={'1 2 3 456' ['4 32 1' '95 7 6']}
a =
'1 2 3 456' '4 32 195 7 6'
>> b=cellfun(@str2num,a,'uniformOutput',false)%返回值不保存在cell
b =
[1x4 double] [1x5 double]
>> b{1}
ans =
1 2 3 456
>> b{2}
ans =
4 32 195 7 6
A = {'ab','abc','abcd'};
l = cellfun(@(x)length(x),A)
-------------------------------------------
A = {'ab','abc','abcd'};
l2 = zeros(1,3);
for k = 1:length(A)
l2(k) = length(A{k});
end
-----------------------------------------
向量化编程:arrayfun及cellfun函数的使用
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);
forii=1:10
forjj=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函数也有类似妙用。
example1:
functionaa=sumsum(a)
aa=sum(sum(a));
>>b=zeros(2,2);
>>c=ones(3,3);
>>d={b,c}
d =
[2x2double] [3x3 double]
cellfun(@sumsum,d)
ans=
0 9
example2:
CELLFUN Apply a function to each cell of a cell array.
a={'1 2 3 456' ['4 32 1' '95 7 6']}
a =
'1 2 3 456' '4 32 195 7 6'
>> b=cellfun(@str2num,a,'uniformOutput',false)%返回值不保存在cell
b =
[1x4 double] [1x5 double]
>> b{1}
ans =
1 2 3 456
>> b{2}
ans =
4 32 195 7 6
相关文章推荐
- Matlab special usage : @ and Struct
- opencv、matlab查看函数的定义、封装
- LU分解(matlab实现)
- 基于小波变换的图像去噪matlab仿真
- MATLAB 的绘图:二维和三维
- 针对MATLAB(imfilter)翻译C语言(opencv)遇到的问题
- matlab .m文件的编写&使用
- matlab冒号的用法
- matlab--关机命令与断点命令
- YOLO训练之标注数据转化XML matlab编程
- matlab中的卷积——filter,conv之间的区别
- MATLAB如何定义函数
- C++ 调用Matlab画图
- matlab 信号与系统(一)—— 上采样(Upsampling)和下采样(Downsampling)
- 用MATLAB将矩阵数据写入txt文件中,打开乱码原因
- matlab小数取整函数
- 海明嵌入Hamming Embedding生成Binary Signature之matlab程序代码
- matlab机器人工具箱的安装和使用
- matlab求解微分方程
- 动态规划 - 计算二项式系统 ---MATLAB代码