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

204 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情 cell数组是保存各种类型和大小信息的有用方法(结构也是如此)。当需要对cell数组中的所有值或值的子集执行操作或计算时,可以使用的一个有用函数是cellfun。与structfun或arrayfun等其他函数类似,cellfun允许将预定义或用户定义的函数应用于数组中的每个元素。

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

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

图片

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

图片

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)

图片

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

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

图片

将num2cell与cellfun相结合可以实现进一步的矩阵计算。例如,可以对以下阵列的每一列执行矩阵乘法:

C = num2cell(rand(3,10),1) Ctimes = cellfun(@(x) A{1}*x,C,'UniformOutput',false)

图片

当然我们也可以自己创建了以下函数,以确定数组的总和、平均值和最小值:

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