matlab中cellfun和arrayfun相关的几个问题

问题背景,有一个符号矩阵A,大小为8*8,其中每个元素都是sym,需要对其进行定积分,积分次数为100次,也就是需要做100次定积分,每次积分变量不同。

对于这个问题,首先想到的是利用for循环100次做,但是我们直到matlab对于循环并不友好,比较耗时。此外,对于符号积分函数int,一次运算大概需要3-5s(可能我的电脑比较差),100次运算就需要300到500秒,也就是5到10分钟,假如外面还需要循环的话那么需要的时间将翻倍,实在不是个明智的选择,因此考虑如何利用matlab的特点进行矢量化运算,也就是避免for循环。

matlab中有两个函数能够实现对数组中的每个元素进行函数运算,分别是cellfun,和arrayfun;两个函数用法相似。这里先记录一下他们共同的用法格式:
1、利用cellfun函数
A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。
您不能指定 cellfun 计算 A 的各元素的顺序,也不能指望它们按任何特定的顺序完成计算。
示例
A = cellfun(func,C1,…,Cn) 将 func 应用于 C1,…,Cn 的各元胞的内容,因此 A(i) = func(C1{i},…,Cn{i})。函数 func 必须接受 n 个输入参数并返回一个标量。元胞数组 C1,…,Cn 的大小必须全部相同。
示例
A = cellfun(,Name,Value) 应用 func 并使用一个或多个 Name,Value 对组参数指定其他选项。例如,要以元胞数组形式返回输出值,请指定 ‘UniformOutput’,false。当 func 返回的值不能串联成数组时,可以按元胞数组的形式返回 A。您可以将 Name,Value 对组参数与上述任何语法中的输入参数结合使用。
示例
当 func 返回 m 个输出值时,[A1,…,Am] = cellfun(
) 返回多个输出数组 A1,…,Am。func 可以返回不同数据类型的输出参数,但每次调用 func 时返回的每个输出的数据类型必须相同。您可以将此语法与前面语法中的任何输入参数结合使用。
从 func 返回的输出参数的数量不必与 C1,…,Cn 指定的输入参数的数量相同。

上面的内容都是从官网复制的,具体的看链接:cellfun

这里说一下他们的区别:cellfun只能对cell类型的量使用,当调用的函数有多个变量时,比如这里的int,直接按顺序写在后面即可;

l=cellfun(@int,A_cell(:,1),A_cell(:,2),A_cell(:,3),‘UniformOutput’,false)

上例中int为函数,,他需要三个变量,分别被积函数,积分起点和终点,直接按顺序写在后面就行。后面的UniformOutput’,false用来控制输出,详情看官网;这个例子跟官网上的某个例子相同:
在这里插入图片描述
cellfun函数只能处理cell类型,所以需要吧被积函数A,步长的起点和终点修改成cell类型;
对于步长,直接用函数num2cell即可将double数组编成cell变量。
这里记一下matlab中括号和冒号索引的用法,()可以配合:表示范围索引,但cell类型{}只能表示单个变量的输入输出。
我需要生成大小为100*1的cell,里面的数据都是符号矩阵A,但是冒号表达式两边的复制维数必须一样,因此肯定不行,用for循环显然非常消耗时间,这里使用函数deal,直接对cell进行赋值。
deal函数只能批量赋值给同类型的函数,因此在使用之前必须吧A办成cell类型,即可执行: *A{1,1}=A;*即可

这样处理完后相应的参数就全部用cell表达,因此可以直接使用cellfun;

l=cellfun(@int,A_cell(:,1),A_cell(:,2),A_cell(:,3),‘UniformOutput’,false)

2、利用arrayfun函数
和cellfun函数不同,arrayfun函数只能处理单变量,也就是说他调用的函数只能有一个输入,但如果有多个输入要怎么办呢?利用结构体,看官网给出的例子:
在这里插入图片描述
因此,在使用arrayfun之前,将变量封装成struct格式才行。
但我在网上查找好久,没发现能够实现结构体批量赋值的方式,只有cell2struct转换。因此不如用cellfun函数;

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值