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

时间:2022-07-04 00:54:24
✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。

????个人主页:算法工程师的学习日志

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

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

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

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

cellfun('size',greetings,2)


cellfun('length',greetings)

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

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批量处理元胞数组函数-cellfun

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

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

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

将num2cell与cellfun相结合可以实现进一步的矩阵计算。

例如,可以对以下阵列的每一列执行矩阵乘法:

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

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

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

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