当前位置: 首页 > web >正文

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函数;

http://www.xdnf.cn/news/11578.html

相关文章:

  • 微信小程序-页面开发
  • 最流行的三大数据建模工具
  • 用Python实现QQ找茬游戏外挂工具
  • 编程入门宝典,刚开始学习编程新手必看的5点建议!
  • 大开眼界系列之九:“双缝实验”及“蔡定谔的猫”量子实验其实揭开的是佛的真相...
  • 分享9款漂亮的浪漫情侣网站模板
  • 口袋妖怪金心银魂详细图文攻略(下)及游戏下载
  • 深入Device Tree--LINUX中用DT_MACHINE_START/MACHINE_START
  • 禅道的安装及使用流程
  • 霍兰德测试告诉你:最适合你的职业方向是什么?(包含开源免费的API接口)
  • 【2023最新版】超详细Wireshark安装保姆级教程,Wireshark抓包(网络分析),收藏这一篇就够了
  • ERROR: Could not connect to lockdownd, error code -19 -20
  • 【有内鬼,终止交易】手机壁纸Android客户端创意实现
  • Windows远控之权限维持
  • Android开发新手入门教程,【干货
  • vs2010 玩转金山界面库 (1)贮备篇
  • SQLite 入门教程(非常详细)零基础入门到精通,收藏这一篇就够了
  • 解决Foxit Reader 中文乱码问题
  • 亦舒的77句话
  • 你见过最“变态”的CPU散热器是什么样的?
  • Java注解面试题
  • 腾云忆想技术干货|TSF微服务治理实战系列(三)——服务限流
  • metaRTC+ZLMediaKit实现webrtc的推拉流
  • 菊花香香儿
  • GBK-unicode对照
  • JAVA经典面试题附答案
  • P4290 [HAOI2008]玩具取名 区间dp
  • 8个变态问题VS最终变态答案!!!
  • 自学编程推荐的11个学习及刷题网站
  • 2023年全国青少年信息素养大赛(Python)海南赛区复赛真题