主要内容

matlab.tall.reduce

通过对数据块应用约简算法来减少数组

描述

例子

助教= matlab.tall.reduce (fcn,reducefcn,tX应用函数fcn对每一个的数组tX产生部分结果。然后应用函数reducefcn重复将部分结果垂直拼接,直到得到一个最终结果,助教

例子

助教= matlab.tall.reduce (fcn,reducefcn,tX,,……)指定几个数组tX,泰,…这些都是fcn.对每个数组的相同行进行操作fcn;例如,fcn (tX (n: m),泰(n: m,:)).的每个调用都传递高度为1的输入fcn.有了这个语法,fcn必须返回一个输出,和reducefcn必须接受一个输入并返回一个输出。

例子

助教,结核病,...] = matlab.tall.reduce(fcn,reducefcn,tX,,……),在那里fcn而且reducefcn函数是否返回多个输出,返回数组助教,结核病,…的输出参数之一fcn而且reducefcn.该语法有以下要求:

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

  • reducefcn必须有相同数量的输入和输出请求的输出matlab.tall.reduce

  • 的每个输出fcn而且reducefcn必须与第一个输入的类型相同tX

  • 相应的输出fcn而且reducefcn必须有相同的高度。

例子

助教,结核病,...] = matlab.tall.reduce(___、“OutputsLike”{巴勒斯坦权力机构,PB,……})指定输出助教,结核病,…具有与原型数组相同的数据类型PA、PB,……,分别。您可以使用以前语法中的任何输入参数组合。

例子

全部折叠

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

创建一个高的桌子airlinesmall.csv数据集。这些数据包含了美国航班到达和起飞时间的信息。提取ArrDelay变量,它是到达延迟的向量。

ds = tabularTextDatastore(“airlinesmall.csv”,“TreatAsMissing”,“NA”);ds。SelectedVariableNames = {“ArrDelay”“DepDelay”};Tt =高(ds);tX = tt.ArrDelay;

使用matlab.tall.reduce要统计非的总数高向量中的元素。第一个函数元素个数计算每个数据块中的元素数量,以及第二个函数总和将每个块的所有计数相加以生成标量结果。

s = matlab.tall.reduce(@numel,@sum,tX)
s = MxNx…高双阵???...???...? ? ? ... : : : : : :

将结果收集到内存中。

S =集合(S)
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在0.9秒内完成评估在1.1秒内完成
S = 123523

创建一个高表,从表中提取两个高向量,然后计算每个向量的平均值。

创建一个高的桌子airlinesmall.csv数据集。这些数据包含了美国航班到达和起飞时间的信息。提取ArrDelay而且DepDelay变量,它们是到达和离开延迟的向量。

ds = tabularTextDatastore(“airlinesmall.csv”,“TreatAsMissing”,“NA”);ds。SelectedVariableNames = {“ArrDelay”“DepDelay”};Tt =高(ds);Tt = rmmissing(Tt);tX = tt.ArrDelay;tY = tt.DepDelay;

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

函数Bx = sumcount(tx,ty) Bx = [sum(tx) numel(tx) sum(ty) numel(ty)];结束

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

Reducefcn = @(x) sum(x,1);s = matlab.tall.reduce(@sumcount,reducefcn,tX,tY)
s = MxNx…高双阵???...???...? ? ? ... : : : : : :
S =集合(S)
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在1.3秒内完成评估,在1.6秒内完成
s =1×4860584 120866 982764 120866

的前两个要素年代总数和数算吗tX,后两个元素是sum和count for.方法返回的结果与平均值进行比较的意思是函数。

My_mean = [s(1)/s(2) s(3)/s(4)]
my_mean =1×27.1201 - 8.1310
m = collect ([tX tY]))
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在0.34秒内完成评估,在0.44秒内完成
m =1×27.1201 - 8.1310

本地函数

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

函数Bx = sumcount(tx,ty) Bx = [sum(tx) numel(tx) sum(ty) numel(ty)];结束

创建一个高表,然后计算数据中每年的平均航班延误。

创建一个高的桌子airlinesmall.csv数据集。这些数据包含了美国航班到达和起飞时间的信息。从表中删除缺失的数据行,并提取ArrDelay,DepDelay,一年变量。这些变量是数据集中每个航班的到达和起飞延误以及相关年份的向量。

ds = tabularTextDatastore(“airlinesmall.csv”,“TreatAsMissing”,“NA”);ds。SelectedVariableNames = {“ArrDelay”“DepDelay”“年”};Tt =高(ds);Tt = rmmissing(Tt);

使用matlab.tall.reduce在高桌子上应用两个功能。第一个函数结合ArrDelay而且DepDelay求每个航班总平均延误的变量。该函数确定每个数据块中有多少个唯一的年份,然后循环每年,并计算出该年航班的平均总延误。结果是一个包含年份和平均总延迟的两个变量表。这个中间数据需要进一步减少,才能得出每年的平均延迟。将此函数保存在当前文件夹为transform_fcn.m

类型transform_fcn
函数t = transform_fcn(a,b,c) ii = gather(唯一(c));对于k = 1:length(ii) jj = (c == ii(k));D = mean([a(jj) b(jj)], 2);if k == 1 t = table(c(jj),d,'VariableNames',{'Year' 'MeanDelay'});Else t = [t;表(c (jj), d, VariableNames,{‘年’‘MeanDelay})];结束结束

第二个函数使用第一个函数的结果来计算每年的平均总延迟。的输出reduce_fcn是否与输出兼容transform_fcn,这样数据块就可以按任意顺序连接起来,并不断减少,直到每年只剩下一行。

类型reduce_fcn
function TT = reduce_fcn(t) [groups,Y] = findgroups(t. year);D = splitapply(@mean, t.MeanDelay, groups);TT = table(Y,D,'VariableNames',{'Year' 'MeanDelay'});结束

对高向量应用变换和约简函数。由于输入(类型)和输出(类型表格)具有不同的数据类型,则使用“OutputsLike”名称-值对指定输出为表。指定输出类型的一种简单方法是使用虚拟输入调用transform函数。

a = tt.ArrDelay;b = tt.DepDelay;c = tt.年;D1 = matlab.tall。reduce(@transform_fcn, @reduce_fcn, a, b, c,“OutputsLike”{transform_fcn (0, 0, 0)})
d1 = Mx2高桌年MeanDelay ____ _________ ??????: : : :

将结果收集到内存中,查看每年的平均总航班延误。

D1 =集合(D1)
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在0.97秒内完成评估在1.1秒内完成
d1 =22×2表年MeanDelay ____ _________ 1987 7.6889 1988 6.7918 1989 8.0757 1990 7.1548 1991 4.0134 1992 5.1767 1993 5.4941 1994 6.0303 1995 8.4284 1996 9.6981 1997 8.4346 1998 8.3789 1999 8.9121 2000 10.595 2001 6.8975 2002 3.4325 \

替代方法

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

使用这种方法,您调用findgroups而且splitapply直接在数据上。这个函数mySplitFcn对每组数据的操作包括对matlab.tall.reduce.所使用的变换和约简函数matlab.tall.reduce不需要分组的数据,所以那些函数只是对预分组的数据执行计算吗splitapply传给他们。

类型mySplitFcn
function 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 = mean([a b], 2);t = table(c,d,'VariableNames',{'Year' 'MeanDelay'});结束函数TT = non_group_reduce_fcn(t) D = mean(t. meandelay);TT = table(t.Year(1),D,'VariableNames',{'Year' 'MeanDelay'});结束结束

调用findgroups而且splitapply对数据进行操作并应用mySplitFcn对每组数据。

组= findgroups(c);d2 = splitapply(@mySplitFcn, a, b, c, groups);D2 =收集(D2)
使用本地MATLAB会话评估tall表达式:-通过2中的第1步:在0.35秒内完成-通过2中的第2步:在0.95秒内完成评估在1.6秒内完成
d2 =22×2表年MeanDelay ____ _________ 1987 7.6889 1988 6.7918 1989 8.0757 1990 7.1548 1991 4.0134 1992 5.1767 1993 5.4941 1994 6.0303 1995 8.4284 1996 9.6981 1997 8.4346 1998 8.3789 1999 8.9121 2000 10.595 2001 6.8975 2002 3.4325 \

使用权重向量计算高数组的加权标准差和方差。这是如何使用的一个例子matlab.tall.reduce来解决高数组还不支持的功能。金宝app

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

rng默认的tX =高(rand(1e4,1));P = rand(1e4,1);tP =高(正常化(p,“规模”、sum (p)));

写一个恒等函数,返回输出等于输入。的转换步骤matlab.tall.reduce并将数据直接传递到缩减步骤,在该步骤中重复应用缩减函数以减少数据的大小。

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

接下来,编写一个对高向量块进行运算的约简函数,以计算加权方差和标准偏差。

类型weightedStats.m
函数[wvar, wstd] = weightedStats(X, P) wvar = var(X,P);wstd = std(X,P);结束

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

[tX_var_weighted, tX_std_weighted] = matlab.tall。减少(@identityTransform, @weightedStats, tX, tP)
tX_var_weighted = MxNx…高双阵???...???...? ? ? ... : : : : : : tX_std_weighted = MxNx... tall double array ? ? ? ... ? ? ? ... ? ? ? ... : : : : : :

输入参数

全部折叠

将函数转换为应用,指定为函数句柄或匿名函数。的每个输出fcn必须与第一个输入的类型相同tX.您可以使用“OutputsLike”选项返回不同数据类型的输出。如果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而且在高维度是非单块的,那么第一组块可能是x = tX(1:2000,:)而且y = tY(1:2000,:)

    • 如果任何一个的第一个维度[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而且然后用这个命令找到最大值:
tA = matlab.tall。reduce(@sqInputs, @max, tX, tY)

例子:tC = matlab.tall.reduce(@numel,@sum,tX,tY)找出每个块中的元素数量,然后将结果相加以计算元素的总数。

数据类型:function_handle

要应用的还原函数,指定为函数句柄或匿名函数。的每个输出reducefcn必须与第一个输入的类型相同tX.您可以使用“OutputsLike”选项返回不同数据类型的输出。如果reducefcn返回多个输出,则所有输出必须具有相同的高度。

的一般功能签名reducefcn

[rA, rB, rC,…]= reducefcn(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(input) == F(F(input)):对相同的输入重复应用该函数不会改变结果。

    • F ([input1;input2) == F([input2;input1]):结果不应取决于串联的顺序。

    • F ([input1;input2) == F([F(input1);F (input2)]):将函数应用于某些中间结果的拼接一次应该与分别应用它、拼接并再次应用它相同。

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

一些合适的降维函数的例子是内置的降维函数,例如总和,刺激,马克斯等等。这些函数可以作用于由fcn并返回单个标量。这些函数具有这样的属性,即连接发生的顺序和应用约简操作的次数不会改变最终答案。一些函数,例如的意思是而且var,一般应避免作为约简函数,因为应用约简操作的次数可能会改变最终答案。

例子:tC = matlab.tall.reduce(@numel,@sum,tX)找出每个块中的元素数量,然后将结果相加以计算元素的总数。

数据类型:function_handle

输入数组,指定为标量、向量、矩阵或多维数组。输入数组用作转换函数的输入fcn.每个输入数组tX,泰,…必须有兼容的高度。当两个输入具有相同的高度时,或者当一个输入的高度为1时,它们具有兼容的高度。

输出数组的原型,指定为数组。当你指定“OutputsLike”,输出数组助教,结核病,…返回的matlab.tall.reduce具有与指定数组相同的数据类型和属性{PA、PB,…}

例子:tA = matlab.tall.reduce(fcn,reducefcn,tX,'OutputsLike',{int8(1)});,在那里tX是双精度高数组,返回助教作为int8而不是

输出参数

全部折叠

输出数组,以标量、向量、矩阵或多维数组的形式返回。如有任何输入matlab.tall.reduce,那么所有输出参数也都是高的。否则,所有输出参数都是内存中的数组。

输出数组的大小和数据类型取决于指定的函数fcn而且reducefcn.一般来说,输出助教,结核病,…必须都具有与第一个输入相同的数据类型吗tX.但是,您可以指定“OutputsLike”返回不同的数据类型。输出数组助教,结核病,…都有相同的高度。

更多关于

全部折叠

高阵列块

从数据存储创建高数组时,底层数据存储有助于在计算期间移动数据。数据以离散块的形式移动,称为,其中每个块是一组连续的行,可以放入内存中。例如,一个2-D数组(如表)的一个块为X (n: m:),用于一些下标n而且.的值为基础ReadSize属性,但块的大小可能不完全相同。为了matlab.tall.reduce,一个高数组被认为是许多这样的块的垂直连接:

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

ds = tabularTextDatastore(“airlinesmall.csv”,“TreatAsMissing”,“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中引入