Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

structfun

对标量结构体的每个字段应用函数

说明

示例

A = structfun(func,S) 将函数 func 应用于标量结构体 S 的每个字段,每次一个字段。然后 structfunfunc 的输出串联成列向量 A。输入参数 func 是一个函数的函数句柄,此函数接受一个输入参数并返回一个标量。func 的输出可以是任何数据类型,只要该类型的对象可以串联即可。A 中的元素数等于 S 中的字段数。

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

示例

A = structfun(func,S,Name,Value) 应用 func 并使用一个或多个 Name,Value 对组参数指定其他选项。例如,要以结构体形式返回输出值,请指定 'UniformOutput',false。当 func 返回的值不能合并为数组时,可以按结构体形式返回 A。返回的结构体具有与 S 相同的字段。

示例

func 返回 m 个输出值时,[A1,...,Am] = structfun(___) 返回多个输出数组 A1,...,Amfunc 可以返回不同数据类型的输出参数,但每次调用 func 时返回的每个输出的数据类型必须相同。您可将此语法与上述语法中的任何输入参数一起使用。

示例

全部折叠

创建一个标量结构体,其字段中包含不同大小的数值数组。

S.f1 = 1:10;
S.f2 = [2; 4; 6];
S.f3 = []
S = struct with fields:
    f1: [1 2 3 4 5 6 7 8 9 10]
    f2: [3x1 double]
    f3: []

计算每个数值数组的均值,然后以数组的形式返回这些均值。

A = structfun(@mean,S)
A = 3×1

    5.5000
    4.0000
       NaN

创建一个标量结构体,其中的每个字段包含一个由随机数组成的数组。

S.X = rand(1,10);
S.Y = rand(1,10);
S.Z = rand(1,10)
S = struct with fields:
    X: [0.8147 0.9058 0.1270 0.9134 0.6324 0.0975 0.2785 0.5469 0.9575 0.9649]
    Y: [0.1576 0.9706 0.9572 0.4854 0.8003 0.1419 0.4218 0.9157 0.7922 0.9595]
    Z: [0.6557 0.0357 0.8491 0.9340 0.6787 0.7577 0.7431 0.3922 0.6555 0.1712]

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

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

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

创建一个标量结构体,其字段中包含矩阵。

S.f1 = 1:10;
S.f2 = [2 3; 4 5; 6 7];
S.f3 = rand(4,4)
S = struct with fields:
    f1: [1 2 3 4 5 6 7 8 9 10]
    f2: [3x2 double]
    f3: [4x4 double]

计算每个矩阵的均值。mean 返回包含每列均值的向量,因此不能以数组的形式返回均值。要以结构体形式返回均值,请指定 'UniformOutput',false 名称-值对组。

A = structfun(@mean,S,'UniformOutput',false)
A = struct with fields:
    f1: 5.5000
    f2: [4 5]
    f3: [0.6902 0.3888 0.7627 0.5962]

创建一个标量结构体。

S.f1 = 1:10;
S.f2 = [2 3; 4 5; 6 7];
S.f3 = rand(4,4)
S = struct with fields:
    f1: [1 2 3 4 5 6 7 8 9 10]
    f2: [3x2 double]
    f3: [4x4 double]

计算 S 中每个数组的大小。行数和列数都是一个 3×1 数值数组。

[nrows,ncols] = structfun(@size,S)
nrows = 3×1

     1
     3
     4

ncols = 3×1

    10
     2
     4

输入参数

全部折叠

要应用于输入标量结构体字段的函数,指定为函数句柄。

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

示例: A = structfun(@max,S) 返回 S 的每个字段的最大值。

输入结构体,指定为标量结构体。

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: A = structfun(@mean,S,'UniformOutput',false) 以结构体形式返回 mean 的输出,此结构体的字段与 S 相同。

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

'UniformOutput' 的值

描述

true (1)

func 必须返回可由 structfun 串联成列向量的标量。

false (0)

structfun 以一个或多个标量结构体的形式返回 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',则 structfun 会再次引发由 func 引发的错误。

输出参数

全部折叠

输出数组,以任何数据类型的列向量形式或以标量结构体形式返回。

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

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

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

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

扩展功能

版本历史记录

在 R2006a 之前推出