主要内容

matlab.tall.reduce.reduce.

通过将缩小算法应用于数据块来减少数组

描述

例子

TA.= matlab.tall.reduce(FCN.reducefcnTX.适用该功能FCN.每个阵列TX.生成部分结果。然后这个功能适用reducefcn反复垂直偏移部分效果,直到它有一个最终结果,TA.

例子

TA.= matlab.tall.reduce(FCN.reducefcnTX.t,......)指定多个数组TX,TY,...这是输入的FCN.。每个阵列的相同行按照FCN.;例如,fcn(tx(n:m,:),ty(n:m,:))。的每个调用都传递高度为1的输入FCN.。使用此语法,FCN.必须返回一个输出,并reducefcn必须接受一个输入并返回一个输出。

例子

[TA.TB.,...] = matlab.tall.reduce(FCN.reducefcnTX.t,......), 在哪里FCN.reducefcn是返回多个输出的函数,返回数组ta,tb,...,每个对应于其中一个输出参数FCN.reducefcn。此语法具有以下要求:

  • FCN.必须返回与请求的相同数量的输出matlab.tall.reduce.reduce.

  • reducefcn必须具有相同数量的输入和输出作为所要求的输出数量matlab.tall.reduce.reduce.

  • 每个输出的FCN.reducefcn必须与第一个输入相同TX.

  • 相应的输出FCN.reducefcn必须有相同的高度。

例子

[TA.TB.,...] = matlab.tall.reduce(___,'outputslike',{paPB.,...})指定输出ta,tb,...具有与原型数组相同的数据类型PA,PB,......, 分别。您可以在以前的语法中使用任何输入参数组合。

例子

全部折叠

创建一个高表,从表中提取一个高向量,然后找到向量中元素的总数。

创建一个高的桌子Airlinesmall.csv.数据集。数据包含有关美国航班的抵达和出发时间的信息。提取arrdelay.变量,这是抵达延迟的矢量。

ds = tabulartextdataStore('airlinesmall.csv''尾声''na');ds.selectedvariablenames = {'arrdelay''depdelay'};tt =高(ds);tX = tt.ArrDelay;

使用matlab.tall.reduce.reduce.计算非的总数在高的传染媒介的元素。第一个功能numel.计算每个数据块中的元素数量,第二个函数将每个块的所有计数加在一起以产生一个标量结果。

s = matlab.tall.reduce(@ numel,@ sum,tx)
s = mxnx ...高级双数组???......???......???... :::::::::

将结果收集到内存中。

s =聚集(s)
使用本地MATLAB会话评估高表达: - 通过1的1:1:在1.5秒评估中完成的1.8秒完成
s = 123523

创建一个高大的表,提取两个高vectors形成表,然后计算每个矢量的平均值。

创建一个高的桌子Airlinesmall.csv.数据集。数据包含有关美国航班的抵达和出发时间的信息。提取arrdelay.DEPDELAY.变量,这是抵达和离开延误的矢量。

ds = tabulartextdataStore('airlinesmall.csv''尾声''na');ds.selectedvariablenames = {'arrdelay''depdelay'};tt =高(ds);tt = rmmissing (tt);tX = tt.ArrDelay;泰= tt.DepDelay;

在算法的第一阶段,计算向量中每个数据块的和和元素计数。为此,您可以编写一个函数,该函数接受两个输入并返回一个输出,其中包含每个输入的和和计数。这个函数在示例的最后作为一个局部函数列出。

函数Bx = [sum(tx) numel(tx) sum(ty) numel(ty)];结尾

在算法的缩减阶段,您需要加入所有中间和数量和计数。因此,matlab.tall.reduce.reduce.返回每个输入向量的元素的总和和元素数,并计算平均值是一个简单的划分。对于此步骤,您可以应用从第一阶段函数从1×4向量输出的第一维度。

recentfcn = @(x)总和(x,1);s = matlab.tall.reduce(@ sumcount,sydreffcn,tx,ty)
s = mxnx ...高级双数组???......???......???... :::::::::
s =聚集(s)
使用本地MATLAB会话评估高表达式:-通过1:在2.4秒完成评估在2.9秒完成
S =1×4860584 120866 982764 120866

前两个元素S.是总和和数量TX.,第二个元素是sum和count fort。除以总和和计数会产生平均值,您可以比较返回的答案吝啬的功能。

my_mean = [s(1)/ s(2)s(3)/ s(4)]
my_mean =.1×27.1201 8.1310
m =聚集(平均值([Tx TY]))
使用当地MATLAB会话评估高表达: - 通过1的1:0.64秒评估完成0.86秒
m =1×27.1201 8.1310

本地功能

这里列出的是SUMCOUNT.函数matlab.tall.reduce.reduce.调用来计算中间和和元素计数。

函数Bx = [sum(tx) numel(tx) sum(ty) numel(ty)];结尾

创建一个高大的表,然后计算数据中每年的平均飞行延迟。

创建一个高的桌子Airlinesmall.csv.数据集。数据包含有关美国航班的抵达和出发时间的信息。从表中删除缺失数据的行并提取arrdelay.DEPDELAY.,变量。这些变量是数据集中每个航班到达和离开延误和相关年份的向量。

ds = tabulartextdataStore('airlinesmall.csv''尾声''na');ds.selectedvariablenames = {'arrdelay''depdelay''年'};tt =高(ds);tt = rmmissing (tt);

使用matlab.tall.reduce.reduce.将两个功能应用于高桌子。第一个功能结合了arrdelay.DEPDELAY.变量找到每个航班的总均值延迟。该函数确定每条数据中的独特数量有多少年,然后每年周期循环,并计算当年的航班平均延迟。结果是包含年份的双变量表和平均总延迟。这种中间数据需要进一步减少,以达到每年平均延迟。将此功能保存在当前文件夹中变换_fcn.m.

类型变换_fcn.
功能t = transform_fcn(a,b,c)II =聚集(唯一(c));对于k = 1:长度(ii)jj =(c ==i(k));d =均值([a(jj)b(jj)],2);如果k == 1 t = table(c(jj),d,'variablenames',{'年''incomdelay'});否则t = [t;表(c(jj),d,'variablenames',{'一年'incomdelay'})];结束结束

第二个功能使用第一个功能的结果来计算每年的平均总延迟。输出从recument_fcn.与输出兼容变换_fcn.,这样数据块就可以以任何顺序连接起来,并不断减少,直到每年只剩下一行。

类型recument_fcn.
函数tt = recens_fcn(t)[组,y] = findgroups(t.year);d = sclustapply(@mean,t.meandelay,组);tt =表(y,d,'variablenames',{'年''incomdelay'});结尾

将变换应用于高向量。自输入以来(类型双倍的)和输出(类型表格)有不同的数据类型,使用'opportslike'名称 - 值对以指定输出是表。一种指定输出类型的简单方法是用虚拟输入调用变换函数。

a = tt.arrdelay;b = tt.depdelay;c = tt.year;d1 = matlab.tall.reduce(@transform_fcn,@reduce_fcn,a,b,c,'opportslike',{transform_fcn(0,0,0)})
d1 = mx2高表年意味着____ _________??????::::::::

将结果集成到内存中,以查看每年平均总飞行延误。

d1 =聚集(D1)
使用本地MATLAB会话评估高表达: - 通过1的第1条:2.5秒评估完成2.9秒
d1 =22×2表年份__________ 1987 7.6889 1988 6.7918 1989 8.7918 1990 19.0757 1990 7.0134 1991 1992 5.134 1993 5.1967 1993 5.4941 1994 6.0303 1995 1996 9.6981 1999 8.4346 1999 8.3789 1999 8.9121 2001 8.9121 2001年6月3.895 2002 6.8975 2002 3.4325 2002 3.4325 2001年3.8975 2002 3.4325 2002 3.8975 2002 3.4325 2002 3.8975 2002 3.4325 2002年3.897 2002

替代方法

按组计算相同统计数据的另一种方法是使用裂开打电话matlab.tall.reduce.reduce.(而不是使用matlab.tall.reduce.reduce.打电话裂开)。

使用这种方法,你致电findgroups.裂开直接在数据上。功能mysplitfcn.在每组数据上运行,包括呼叫matlab.tall.reduce.reduce.。改造和减少职能matlab.tall.reduce.reduce.不需要对数据进行分组,因此这些函数仅对预群数据执行计算裂开传给他们。

类型mysplitfcn.
函数t = mysplitfcn(a,b,c)t = matlab.tall.reduce(@non_group_transform_fcn,@non_group_reduce_fcn,... a,b,c,'outputslike',{non_group_transform_fcn(0,0,0)});功能t = non_group_transform_fcn(a,b,c)d =均值([a b],2);t =表(c,d,'variablenames',{'年''incomdelay'});结束函数tt = non_group_reduce_fcn(t)d =均值(t.meandelay);tt =表(t.year(1),d,'variablenames',{'年''incomdelay'});结束

称呼findgroups.裂开在数据上运行并应用mysplitfcn.到每组数据。

组= findgroups (c);d2 = splitapply(@mySplitFcn, a, b, c, groups);d2 =收集(d2)
使用本地MATLAB会话评估高表达: - 通过第1条:在0.91秒内完成 -  PASS 2的2:22秒评估完成4.1秒
d2 =22×2表年份__________ 1987 7.6889 1988 6.7918 1989 8.7918 1990 19.0757 1990 7.0134 1991 1992 5.134 1993 5.1967 1993 5.4941 1994 6.0303 1995 1996 9.6981 1999 8.4346 1999 8.3789 1999 8.9121 2001 8.9121 2001年6月3.895 2002 6.8975 2002 3.4325 2002 3.4325 2001年3.8975 2002 3.4325 2002 3.8975 2002 3.4325 2002 3.8975 2002 3.4325 2002年3.897 2002

使用权重的矢量计算高阵列的加权标准偏差和方差。这是你如何使用的一个例子matlab.tall.reduce.reduce.围绕功能工作,高大阵列尚不支持。金宝app

创建两个随机数据的高向量。TX.包含随机数据,和TP.包含相应的概率总和(tP)1。这些概率适合于对数据进行加权。

rng默认tX =高(兰德(1 e4, 1));p =兰德(1 e4, 1);tP =高(正常化(p,'规模',总和(p))));

编写一个身份函数,返回等于输入的输出。这种方法跳过了变换步骤matlab.tall.reduce.reduce.并将数据直接传递给减少步骤,其中重复应用减少功能以减小数据的大小。

类型IdentityTransform.m.
函数[A,B] = identityTransform(X,Y) A = X;B = Y;结尾

接下来,写入一个在高向量的块上运行的减少函数,以计算加权方差和标准偏差。

类型加权
函数[wvar,wstd] = preceedstats(x,p)wvar = var(x,p);wstd = std(x,p);结尾

使用matlab.tall.reduce.reduce.将这些功能应用于高位向量中的数据块。

[tx_var_weighted,tx_std_wuighted] = matlab.tall.reduce(@idertitytransform,@weightedstats,tx,tp)
tx_var_weighted = mxnx ...高级双数组???......???......???... :::::::txstd_weighted = mxnx ...高级双数组? ? ? ... ? ? ? ... ? ? ? ... : : : : : :

输入参数

全部折叠

转换要应用的函数,指定为函数句柄或匿名函数。每个输出的FCN.必须与第一个输入相同TX.。你可以使用'opportslike'选项返回不同数据类型的输出。如果FCN.返回多个输出,然后输出必须具有相同的高度。

一般功能签名FCN.

[a,b,c,...] = fcn(x,y,z,...)
FCN.必须满足以下要求:

  1. 输入参数——输入[x,y,z,...]是适合内存的数据块。通过从各个高阵列输入中提取数据来产生块[TX,TY,TZ,......]。输入[x,y,z,...]满足这些属性:

    • 所有的[x,y,z,...]在任何允许的扩展后,在第一维度中具有相同的尺寸。

    • 数据块[x,y,z,...]来自高大维度的同一索引,假设高大的阵列是高层尺寸的不明显。例如,如果TX.t是高大维度的非星期顿,然后第一组块可能是x = tx(1:20000,:)y =泰(1:20000:)

    • 如果任何一个的第一维度[TX,TY,TZ,......]尺寸1,然后是相应的块[x,y,z,...]包含那个高数组中的所有数据。

  2. 输出参数- 输出[A,B,C,......]是否适合存储器的块,将发送到相应的输出[ta,tb,tc,...]。产出[A,B,C,......]满足这些属性:

    • 所有的[A,B,C,......]必须在第一维中具有相同的尺寸。

    • 所有的[A,B,C,......]与先前调用的相应结果垂直连接FCN.

    • 所有的[A,B,C,......]在其各自的目标输出阵列中发送到第一维中的相同索引。

  3. 功能规则-FCN.必须满足功能规则:

    • F ([inputs1;inputs2]) = = (F (inputs1);F (inputs2)):将该函数应用于输入的连接,应与将该函数分别应用于输入,然后将结果连接相同。

  4. 空投投入——确保FCN.可以处理一个高度0的输入。当文件为空时可能会出现空输入,或者如果您对数据进行了大量过滤,则可能会发生空输入。

例如,此函数接受两个输入阵列,平衡它们,并返回两个输出阵列:

函数[xx,yy] = sqinputs(x,y)xx = x。^ 2;yy = y。^ 2;结尾
将此函数保存到可访问文件夹后,您可以调用正方形的函数TX.t然后用这个命令找到最大值:
ta = matlab.tall.reduce(@sqinpuls,@max,tx,ty)

例子:tc = matlab.tall.reduce(@ numel,@ sum,tx,ty)查找每个块中的元素数,然后将结果与计算结果数量汇总。

数据类型:function_handle.

还原函数,指定为函数句柄或匿名函数。每个输出的reducefcn必须与第一个输入相同TX.。你可以使用'opportslike'选项返回不同数据类型的输出。如果reducefcn返回多个输出,然后输出必须具有相同的高度。

一般功能签名reducefcn

[RA,RB,RC,...] = recentFCN(A,B,C,......)
reducefcn必须满足以下要求:

  1. 输入参数——输入[A,B,C,......]是适合内存的块。数据块是由FCN.,或部分减少输出reducefcn这是再次运行的,以进一步减少。输入[A,B,C,......]满足这些属性:

    • 输入[A,B,C,......]在第一个维度有相同的大小。

    • 对于第一个维度的给定索引,数据块的每一行[A,B,C,......]源自输入,或源自同一先前的呼叫reducefcn

    • 对于第一个维度中的给定索引,输入的每一行[A,B,C,......]对于该索引来说,源自第一维度中的相同索引。

  2. 输出参数- 所有输出[RA,RB,RC,...]必须在第一维中具有相同的尺寸。另外,它们必须与相应的输入垂直互动[A,B,C,......]允许在必要时重复减少。

  3. 功能规则-reducefcn必须满足这些功能规则(最多循环错误):

    • (输入)= = F (F(输入)):反复将功能应用于相同的输入不应改变结果。

    • f([输入1;输入2])== f([输入2;输入1]):结果不应依赖于连接的顺序。

    • f([输入1;输入2])== f([f(输入1); f(输入2)]):将函数应用一下,对一些中间结果的串联应该是相同的,因为单独应用它,并再次施加并申请。

  4. 空投投入——确保reducefcn可以处理一个高度0的输入。当文件为空时可能会出现空输入,或者如果您对数据进行了大量过滤,则可能会发生空输入。对于这个调用,所有输入块都是正确类型和大小的空数组,其维度超过第一个。

合适的减少功能的一些示例是内置尺寸减少功能,例如prod马克斯等等。这些函数可以对由FCN.并返回一个标量。这些函数具有所发生级联的顺序和施加减少操作的次数的属性不会改变最终答案。一些功能,如吝啬的var.,通常应避免作为约简函数,因为应用约简操作的次数可能会改变最终的答案。

例子:tc = matlab.tall.reduce(@ numel,@ sum,tx)查找每个块中的元素数,然后将结果与计算结果数量汇总。

数据类型:function_handle.

输入阵列,指定为标量,向量,矩阵或多维数组。输入阵列用作变换功能的输入FCN.。每个输入数组TX,TY,...必须具有兼容的高度。当它们具有相同的高度时,两个输入具有兼容的高度,或者当一个输入是高度的输入。

输出阵列的原型,指定为阵列。当您指定时'opportslike',输出阵列ta,tb,...返回matlab.tall.reduce.reduce.是否具有与指定数组相同的数据类型和属性{pa,pb,...}

例子:ta = matlab.tall.reduce(fcn,reducefcn,tx,'outputslike',{int8(1)});, 在哪里TX.是一个双精度高数组,返回TA.作为INT8.代替双倍的

输出参数

全部折叠

输出数组,返回为标量、向量、矩阵或多维数组。如果有任何输入matlab.tall.reduce.reduce.很高,然后所有输出参数也高。否则,所有输出参数都是内存阵列。

输出阵列的大小和数据类型取决于指定的函数FCN.reducefcn。一般来说,输出ta,tb,...必须完全具有与第一个输入相同的数据类型TX.。但是,您可以指定'opportslike'返回不同的数据类型。输出阵列ta,tb,...都有相同的高度。

更多关于

全部折叠

高阵列块

当您从数据存储创建一个长数组时,底层数据存储有助于在计算期间移动数据。数据以被称为,每个块是一组可以适合内存的连续行。例如,一个2-D阵列(例如表)的一个块是x(n:m,:),对于一些下标Nm。每个块的大小基于该块的大小基于阅读数据存储的属性,但块可能不是那么大小。出于目的matlab.tall.reduce.reduce.,高大的阵列被认为是许多这样的块的垂直串联:

例如,如果你使用用作变换功能,中间结果是总和每块。因此,不是返回元素之和的单个标量值,结果是一个长度等于块数的向量。

ds = tabulartextdataStore('airlinesmall.csv''尾声''na');ds.selectedvariablenames = {'arrdelay''depdelay'};tt =高(ds);tX = tt.ArrDelay;F = @(x) sum(x,'omitnan');s = matlab.tall.reduce(f,@(x)x,tx);s =聚集(s)
S = 140467 101065 164355 135920 111182 186274 21321

在R2018B中介绍