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