中国汽车工程师之家--聚集了汽车行业80%专业人士 

论坛口号:知无不言,言无不尽!QQ:542334618 

本站手机访问:直接在浏览器中输入本站域名即可 

  • 440查看
  • 0回复

[MATLAB] matlab批量处理元胞数组函数-cellfun

[复制链接]


该用户从未签到

发表于 26-8-2023 14:56:39 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


cell数组是保存各种类型和大小信息的有用方法(结构也是如此)。当需要对cell数组中的所有值或值的子集执行操作或计算时,可以使用的一个有用函数是cellfun。与structfun或arrayfun等其他函数类似,cellfun允许将预定义或用户定义的函数应用于数组中的每个元素。

举个例子,找到cell里面不为空的数组

greetings = {'Hello','Guten Tag','Sawadee','Bonjour','Namaste',''}find(~cellfun('isempty',greetings))

matlab批量处理元胞数组函数-cellfunw1.jpg

cellfun('size',greetings,2)
cellfun('length',greetings)

matlab批量处理元胞数组函数-cellfunw2.jpg

cellfun基本语法

A = cellfun(func,C)

A = cellfun(func,C1,...,Cn)

A = cellfun(___,Name,Value)

[A1,...,Am] = cellfun(___)

A = cellfun(func,C) 将函数 func 应用于元胞数组 C 的每个元胞的内容,每次应用于一个元胞。然后 cellfun 将 func 的输出串联成输出数组 A,因此,对于 C 的第 i 个元素来说,A(i) = func(C{i})。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。数组 A 和元胞数组 C 具有相同的大小。

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。

cellfun其他一些可以执行的内置函数包括:

“isreal”、“islogical”、“ndims”、“prodofsize”、“sclass”

与字符串数组一起,cellfun可以允许更简单的数组操作,而无需使用循环。以以下单元格数组为例:

A = {magic(3) eye(3) rand(4,3)}

如果我们想转置每个单独的数组,我们可以结合使用转置函数和cellfun函数。

Btrans = cellfun(@transpose,A,'UniformOutput',false)

matlab批量处理元胞数组函数-cellfunw3.jpg

默认情况下,“UniformOutput”设置为true,但在这种情况下,我们希望将其设置为false,以便将结果输出到另一个单元格数组中。如果每个数组的输出都是标量,我们可以将“UniformOutput”保留为true。例如,请根据“UniformOutput”的不同值,查看以下对每个数组运行求和的结果。

Bsum = cellfun(@(x) sum(sum(x)),A,'UniformOutput',false)Bsum = cellfun(@(x) sum(sum(x)),A)

matlab批量处理元胞数组函数-cellfunw4.jpg

将num2cell与cellfun相结合可以实现进一步的矩阵计算。例如,可以对以下阵列的每一列执行矩阵乘法:C = num2cell(rand(3,10),1) Ctimes = cellfun(@(x) A{1}*x,C,'UniformOutput',false)
matlab批量处理元胞数组函数-cellfunw5.jpg

当然我们也可以自己创建了以下函数,以确定数组的总和、平均值和最小值:
function [sumArray, averageArray, minArray] = arraystuff(inputArray)sumArray = sum(sum(inputArray));averageArray = mean(mean(inputArray));minArray = min(min(inputArray));end[Asum, Aavg, Amin] = cellfun(@arraystuff,A)
Asum =   45.0000    3.0000    7.3668
Aavg =    5.0000    0.3333    0.6139
Amin =    1.0000         0    0.0975

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 22-11-2024 21:19 , Processed in 0.329410 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.