Main Content

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

rowfun

将函数应用于表或时间表行

说明

B = rowfun(func,A) 将函数 func 应用于表或时间表 A 的每一行,并在表或时间表 B 中返回结果。

func 接受 size(A,2) 个输入项。

如果 A 是时间表,而 func 跨多个行组聚合数据,则 rowfunA 中每个行组的第一个行时间指定为 B 中对应的行时间。要以表的形式返回 B 而不带行时间,请将 'OutputFormat' 指定为 'table'

示例

B = rowfun(func,A,Name,Value) 通过一个或多个 Name,Value 对组参数指定的其他选项将函数 func 应用于表 A 的每行。

例如,您可以指定将哪些变量传递到函数 func 以及如何调用 func

示例

全部折叠

将函数 hypot 应用于 5×2 表 A 的每行,以计算变量 xy 之间的最短距离。

创建一个表 A,其中包含两个数值数据变量。

rng('default')
x = randi(10,[5,1]);
y = randi(10,[5,1]);
A = table(x,y)
A=5×2 table
    x     y 
    __    __

     9     1
    10     3
     2     6
    10    10
     7    10

将函数 hypot 应用于 A 的每行。函数 hypot 采用两个输入项并返回一个输出项。

B = rowfun(@hypot,A,'OutputVariableNames','z')
B=5×1 table
      z   
    ______

    9.0554
     10.44
    6.3246
    14.142
    12.207

B 是一个表。

将函数输出 B 追加到输入表 A 的末尾。

[A B]
ans=5×3 table
    x     y       z   
    __    __    ______

     9     1    9.0554
    10     3     10.44
     2     6    6.3246
    10    10    14.142
     7    10    12.207

定义几何布朗运动模型并将其应用于一系列参数。

在名为 gbmSim.m 的文件中创建一个包含以下代码的函数。

% Copyright 2015 The MathWorks, Inc.

function [m,mtrue,s,strue] = gbmSim(mu,sigma)
% Discrete approximation to geometric Brownian motion
%
% [m,mtrue,s,strue] = gbmSim(mu,sigma) computes the 
% simulated mean, true mean, simulated standard deviation, 
% and true standard deviation based on the parameters mu and sigma.
numReplicates = 1000; numSteps = 100;
y0 = 1;
t1 = 1;
dt = t1 / numSteps;
y1 = y0*prod(1 + mu*dt + sigma*sqrt(dt)*randn(numSteps,numReplicates));
m = mean(y1); s = std(y1);

% Theoretical values
mtrue = y0 * exp(mu*t1); strue = mtrue * sqrt(exp(sigma^2*t1) - 1);
end

gbmSim 接受两个输入项 musigma,并返回四个输出项,分别为 mmtruesstrue

定义表 params,其中包含要输入到布朗运动模型中的参数。

mu = [-.5; -.25; 0; .25; .5];
sigma = [.1; .2; .3; .2; .1];

params = table(mu,sigma)
params =

  5x2 table

     mu      sigma
    _____    _____

     -0.5     0.1 
    -0.25     0.2 
        0     0.3 
     0.25     0.2 
      0.5     0.1 

将函数 gbmSim 应用于表 params 的各行。

stats = rowfun(@gbmSim,params,...
    'OutputVariableNames',...
    {'simulatedMean' 'trueMean' 'simulatedStd' 'trueStd'})
stats =

  5x4 table

    simulatedMean    trueMean    simulatedStd    trueStd 
    _____________    ________    ____________    ________

       0.60501       0.60653       0.05808       0.060805
       0.77916        0.7788         0.161        0.15733
        1.0024             1        0.3048        0.30688
        1.2795         1.284       0.25851        0.25939
        1.6498        1.6487       0.16285        0.16529

'OutputVariableNames' 名称-值对组参数指定的四个变量名称指示 rowfun 应从 gbmSim 获取四个输出。您可以指定较少的输出变量名称以从 gbmSim 返回较少的输出项。

将函数输出 stats 追加到输入 params 的末尾。

[params stats]
ans =

  5x6 table

     mu      sigma    simulatedMean    trueMean    simulatedStd    trueStd 
    _____    _____    _____________    ________    ____________    ________

     -0.5     0.1        0.60501       0.60653       0.05808       0.060805
    -0.25     0.2        0.77916        0.7788         0.161        0.15733
        0     0.3         1.0024             1        0.3048        0.30688
     0.25     0.2         1.2795         1.284       0.25851        0.25939
      0.5     0.1         1.6498        1.6487       0.16285        0.16529

创建一个表 A,其中 g 是分组变量。

rng('default')
g = randi(3,[15,1]);
x = rand([15,1]);
y = rand([15,1]);

A = table(g,x,y)
A=15×3 table
    g       x           y    
    _    ________    ________

    3     0.14189     0.70605
    3     0.42176    0.031833
    1     0.91574     0.27692
    3     0.79221    0.046171
    2     0.95949    0.097132
    1     0.65574     0.82346
    1    0.035712     0.69483
    2     0.84913      0.3171
    3     0.93399     0.95022
    3     0.67874    0.034446
    1     0.75774     0.43874
    3     0.74313     0.38156
    3     0.39223     0.76552
    2     0.65548      0.7952
    3     0.17119     0.18687

定义一个匿名函数 func,以计算 xy 的平均差。

func = @(x,y) mean(x-y);

计算由分组变量 g 定义的组 123 中变量之间的平均差。

B = rowfun(func,A,...
    'GroupingVariable','g',...
    'OutputVariableName','MeanDiff')
B=3×3 table
    g    GroupCount    MeanDiff
    _    __________    ________

    1        4         0.032744
    2        3          0.41822
    3        8          0.14656

变量 GroupCount 指示 A 中每个组的行数。

输入参数

全部折叠

函数,指定为函数句柄。您可以定义文件中的函数或将其定义为匿名函数。如果 func 对应于多个函数文件(即如果 func 表示一组重载函数),MATLAB® 将基于输入参数的类确定要调用的函数。

func 最多可接受 size(A,2) 个输入项。默认情况下,rowfun 返回 func 的第一个输出。要从 func 返回多个输出,请使用 'NumOutputs''OutputVariableNames' 名称-值对组参数。

示例: func = @(x,y) x.^2+y.^2; 接受两个输入并计算平方和。

输入表,指定为表或时间表。

名称-值对组参数

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

示例: 'InputVariables',2 仅使用 A 中的第二个变量作为 func 的输入。

用于选择 A 中要传递给 func 的变量的设定符,指定为逗号分隔的对组,其中包含 'InputVariables' 和一个正整数、正整数向量、字符向量、字符向量元胞数组、字符串数组、逻辑向量或函数句柄。

如果将 'InputVariables' 指定为函数句柄,则它必须返回逻辑标量,而且 rowfun 只传递 A 中函数返回 1 (true) 的变量。

A 中定义行组的一个或多个变量,指定为逗号分隔的对组,包含 'GroupingVariables' 和一个正整数、正整数向量、字符向量、字符向量元胞数组、字符串数组或逻辑向量。

'GroupingVariables' 的值指定哪些表变量是分组变量,而不是其数据类型。分组变量可以为数值类型或者以下数据类型:categoricalcalendarDurationdatetimedurationlogicalstring

A 中具有相同分组变量值的行属于同一组。rowfunfunc 应用于各行组,而不是单独应用于 A 的各行。输出 B 包含每个组的一行。

如果任一分组变量包含 NaN 或缺失值(例如 NaT、未定义的分类值或缺失字符串),则对应的行不属于任何组,并会从输出中排除。

行标签可以是分组变量。您可以单独按行标签分组,按 A 中的一个或多个变量分组,或者同时按行标签和变量分组。

  • 如果 A 是表,则标签为行名称。

  • 如果 A 是时间表,则标签为行时间。

用于调用带有不同输入项的 func 的指示符,指定为逗号分隔的对组,其中包含 'SeparateInputs' 以及 truefalse10

true

func 期望不同的输入项。rowfun 调用带 size(A,2) 个输入项的 func,每个参数对应一个数据变量。

这是默认行为。

false

func 期望一个包含所有输入项的向量。rowfun 通过串联 A 的每行中的值来创建 func 的输入向量。

将值从元胞变量传递到 func 的指示符,指定为逗号分隔的对组,其中包含 'ExtractCellContents' 以及 truefalse10

true

rowfunA 中提取数据类型为 cell 的变量的内容,并将值而非元胞传递到 func

对于已分组数据的计算而言,元胞变量中每个组内的值必须允许垂直串联。

false

rowfunA 中数据类型为 cell 的变量的元胞传递到 func

这是默认行为。

func 输出的变量名称,以逗号分隔的对组形式指定,其中包含 'OutputVariableNames' 和一个字符向量、字符向量元胞数组或字符串数组,其名称由非空的不同元素构成。名称数量必须等于 func 所需的输出数量。

此外,变量名称必须是有效的 MATLAB 标识符。如果有效的 MATLAB 标识符不适合用作变量名称,MATLAB 将使用 {'Var1' ... 'VarN'} 形式的 N 个字符向量元胞数组,其中 N 为变量数。您可以使用函数 isvarname 来确定有效的 MATLAB 变量名称。

func 的输出数,指定为逗号分隔的对组,其中包含 'NumOutputs'0 或一个正整数。该整数必须小于或等于 func 的可能输出数。

示例: 'NumOutputs',2 使 rowfun 调用带两个输出的 func

B 的格式,指定为逗号分隔的对组,包含 'OutputFormat' 和值 'table''uniform''cell'

'table'

rowfun 返回一个表,且 func 的每个输出对应一个变量。进行分组计算时,B 还包含分组变量。

'table' 允许您使用一个返回不同大小或数据类型的值的函数。不过,对于未分组数据的计算而言,每次调用 func 时,所有的输出必须在一行内。对于分组数据的计算而言,func 的所有输出必须具有相同行数。

这是默认输出格式。

'timetable'

rowfun 返回一个时间表,其中的变量与 A 中的变量(或使用 'InputVariables' 指定的变量)一一对应。进行分组计算时,B 还包含分组变量。

rowfun 根据 A 的行时间创建 B 的行时间。如果为 B 分配的行时间在使用 func 执行的计算环境中没有意义,则请将输出格式指定为 'OutputFormat','table'

如果 A 是时间表,则这是默认输出格式。

'uniform'

rowfunfunc 返回的值串联到向量中。func 的所有输出必须为具有同一数据类型的标量。

'cell'

rowfun 返回元胞数组形式的 B'cell' 允许您使用一个返回不同大小或数据类型的值的函数。

func 失败时调用的函数,指定为逗号分隔的对组,包含 'ErrorHandler' 和一个函数句柄。定义此函数,以便重新引发该错误或者返回函数 func 的有效输出。

MATLAB 调用带两个输入参数的指定错误处理函数:

  • 一个包含以下字段的结构体:

    identifier

    错误标识符。

    message

    错误消息文本。

    index

    出现错误的行或组索引。

  • 发生错误时函数的 func 的输入参数集。

例如,

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

输出参数

全部折叠

输出表,以表或时间表的形式返回。B 可以存储元数据,例如说明、变量单位、变量名称和行名称。有关详细信息,请参阅 tabletimetable 的“属性”部分。

在 R2013b 中推出