Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

arrayfun

将函数应用于每个数组元素

说明

示例

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

您不能指定 arrayfun 计算 B 的各元素的顺序,也不能指望它们按任何特定的顺序完成计算。

B = arrayfun(func,A1,...,An)func 应用于数组 A1,...,An 的元素,因此 B(i) = func(A1(i),...,An(i))。函数 func 必须接受 n 个输入参数并返回一个标量。数组 A1,...,An 的大小必须全部相同。

示例

B = arrayfun(___,Name,Value) 应用 func 并使用一个或多个 Name,Value 对组参数指定其他选项。例如,要以元胞数组形式返回输出值,请指定 'UniformOutput',false。当 func 返回的值不能串联成数组时,可以按元胞数组的形式返回 B。您可以将 Name,Value 对组参数与上述任何语法中的输入参数结合使用。

示例

func 返回 m 个输出值时,[B1,...,Bm] = arrayfun(___) 返回多个输出数组 B1,...,Bmfunc 可以返回不同数据类型的输出参数,但每次调用 func 时返回的每个输出的数据类型必须相同。您可以将此语法与前面语法中的任何输入参数结合使用。

func 返回的输出参数的数量不必与 A1,...,An 指定的输入参数的数量相同。

示例

全部折叠

创建一个非标量结构体数组。每个结构体有一个包含随机数向量的字段。这些向量具有不同的大小。

S(1).f1 = rand(1,5);
S(2).f1 = rand(1,10);
S(3).f1 = rand(1,15)
S=1×3 struct array with fields:
    f1

使用 arrayfun 函数计算 S 中每个字段的均值。不能使用 structfun 完成此计算,因为 structfun 的输入参数必须是标量结构体。

A = arrayfun(@(x) mean(x.f1),S)
A = 1×3

    0.6786    0.6216    0.6069

创建一个结构体数组,其中每个结构体有两个包含数值数组的字段。

S(1).X = 5:5:100; S(1).Y = rand(1,20);
S(2).X = 10:10:100; S(2).Y = rand(1,10);
S(3).X = 20:20:100; S(3).Y = rand(1,5)
S=1×3 struct array with fields:
    X
    Y

绘制数值数组。从 plot 函数返回一个图形线条对象的数组,并使用这些对象为每一组数据点添加不同的标记。arrayfun 可以返回任何数据类型的数组,只要该数据类型的对象可以串联即可。

figure
hold on
p = arrayfun(@(a) plot(a.X,a.Y),S);
p(1).Marker = 'o';
p(2).Marker = '+';
p(3).Marker = 's';
hold off

Figure contains an axes. The axes contains 3 objects of type line.

创建一个非标量结构体数组。每个结构体有一个包含数值矩阵的字段。

S(1).f1 = rand(3,5);
S(2).f1 = rand(6,10);
S(3).f1 = rand(4,2)
S=1×3 struct array with fields:
    f1

使用 arrayfun 函数计算 S 中每个字段的均值。mean 返回包含每列均值的向量,因此不能以数组的形式返回均值。要以元胞数组的形式返回均值,请指定 'UniformOutput',false 名称-值对组。

A = arrayfun(@(x) mean(x.f1),S,'UniformOutput',false)
A=1×3 cell array
    {1x5 double}    {1x10 double}    {[0.3534 0.5603]}

创建一个非标量结构体数组。

S(1).f1 = 1:10;
S(2).f1 = [2; 4; 6];
S(3).f1 = []
S=1×3 struct array with fields:
    f1

使用 arrayfun 函数计算 S 中每个字段的大小。行数和列数分别输出在两个 1×3 数值数组中。

[nrows,ncols] = arrayfun(@(x) size(x.f1),S)
nrows = 1×3

     1     3     0

ncols = 1×3

    10     1     0

输入参数

全部折叠

要对输入数组的元素应用的函数,指定为函数句柄。

func 可以对应于多个函数文件,因此可以表示一组重载函数。在这些情况下,MATLAB® 将基于输入参数的类来确定调用哪个函数。

示例: B = arrayfun(@round,A) 返回 A 的每个元素的整数部分。

输入数组。A 可以是属于任何基本数据类型(但 tabletimetable 除外)的数组,或属于支持线性索引的任何类。

要将函数应用于表或时间表的内容,请使用 varfunrowfunsplitapplygroupsummary 函数。

如果您定义 A 所属的类,还重载了 Asubsrefsize 方法,则 arrayfunA 有以下要求:

  • Asize 方法必须返回双精度数组。

  • A 必须支持线性索引。

  • size 方法返回的大小的乘积不能超过 A 的限值(该限值由 A 的线性索引定义)。

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

示例: A = arrayfun(@(x) mean(x.f1),S,'UniformOutput',false) 返回元胞数组中的均值。S 是一个结构体数组,其中每个结构体有一个名为 f1 的字段。

True 或 false,指定为以逗号分隔的对组,其中包含 'UniformOutput'true (1) 或 false (0)。

'UniformOutput' 的值

说明

true (1)

func 必须返回标量,由 arrayfun 串联成数组。

false (0)

arrayfun 以元胞数组的形式返回 func 的输出。func 的输出可以具有任意大小和不同的数据类型。

用于捕获错误的函数,指定为以逗号分隔的对组,其中包含 'ErrorHandler' 和一个函数句柄。如果 func 引发错误,'ErrorHandler' 指定的错误处理程序将捕获该错误,并执行该函数中指定的操作。错误处理程序必须以两种方式处理错误:或者引发错误,或者返回与 func 同样数量的输出。如果 'UniformOutput' 的值为 true,则错误处理程序的输出参数必须为标量,而且数据类型必须与 func 的输出相同。

错误处理程序的第一个输入参数是包含以下字段的结构体:

  • identifier - 错误标识符

  • message - 错误消息文本

  • index - 输入数组中 func 引发错误的位置的线性索引

错误处理程序的其余输入参数是致使 func 引发错误的 func 调用的输入参数。

假设 func 返回两个双精度值作为输出参数。您可以将错误处理程序指定为 'ErrorHandler',@errorFunc,其中 errorFunc 是引发警告并返回两个输出参数的函数。

function [A,B] = errorFunc(S,varargin)
    warning(S.identifier, S.message); 
    A = NaN; 
    B = NaN;
end

如果您不指定 'ErrorHandler',则 arrayfun 会再次引发由 func 引发的错误。

输出参数

全部折叠

输出数组,以任意数据类型的数组形式或以元胞数组形式返回。

默认情况下,arrayfunfunc 的输出串联成数组。func 必须返回标量。如果 func 返回对象,则对象所属的类必须满足以下要求。

  • 支持通过对象数组的线性索引进行赋值

  • 具有一个 reshape 方法,可返回与输入大小相同的数组

如果 'UniformOutput' 名称-值对组参数的值为 false (0),则 arrayfun 将以元胞数组形式返回输出。在这种情况下,func 的输出可以具有任意大小和不同的数据类型。

局限性

  • 复数输入数组的行为差异

    如果输入数组 A 是复数数组,并且一些元素的虚部等于零,则调用 arrayfun 并对数组进行索引可能会导致不同结果。arrayfun 函数始终将此类数字视为虚部等于零的复数。但是,索引会以实数形式返回这些值。

    为了演示行为的不同,首先创建一个复数数组。

    A = zeros(2,1); A(1) = 1; A(2) = 0 + 1i
    
    A =
    
       1.0000 + 0.0000i
       0.0000 + 1.0000i
    

    然后创建一个元胞数组,并将 A 的元素赋给它。当您对 A(1) 进行索引时,其值作为实数返回,因为其虚部等于零。您可以在 C1 的不同元胞中存储实数和复数值,因为元胞数组可以存储不同类型的数据。

    C1 = cell(2,1); C1{1} = A(1); C1{2} = A(2)
    
    C1 =
    
      2×1 cell array
    
        {[               1]}
        {[0.0000 + 1.0000i]}
    

    调用 arrayfun 并访问 A 的元素。将其值赋给一个元胞数组。当 arrayfun 访问 A(1) 时,它会将该值视为复数,并将其赋给 C2{1}

    C2 = arrayfun(@(x) x, A, 'UniformOutput', false)
    
    C2 =
    
      2×1 cell array
    
        {[1.0000 + 0.0000i]}
        {[0.0000 + 1.0000i]}
    

扩展功能

在 R2006a 之前推出