主要内容

matlab.tall.reduce

对数据块应用约简算法来约简数组

描述

例子

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

例子

助教= matlab.tall.reduce (fcn还原tX,……)指定多个数组tX,泰,…它们是fcn.对每个数组中的相同行进行操作fcn;例如,fcn (tX (n: m),泰(n: m,:)).高度为1的输入将传递给的每个调用fcn.这个语法,fcn必须返回一个输出,并且还原必须接受一个输入并返回一个输出。

例子

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

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

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

  • 每个输出的fcn还原必须与第一个输入的类型相同tX

  • 各部门的相应产出fcn还原必须有相同的高度。

例子

助教结核病,...) = 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)
using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.84 sec
s=123523

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

创建一个高的桌子airlinesmall.csv数据集。这些数据包含了美国航班到达和离开时间的信息。提取ArrDelayDepDelay变量,是到达和离开延误的矢量。

ds = tabularTextDatastore (“airlinesmall.csv”“TreatAsMissing”“NA”);ds。SelectedVariableNames = {“ArrDelay”“DepDelay”}; tt=高(ds);tt=RMM缺失(tt);tX=tt.arr延迟;tY=tt.depday;

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

作用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,泰)
s = MxNx……高双数组???...???...? ? ? ... : : : : : :
s =收集(s)
using the Local MATLAB Session: - Pass 1 of 1: Completed in 2.1 sec
s =1×4860584 120866 982764 120866

前两个要素年代合计和算数吗tX,后两个元素是.将总和和计数相乘得到平均值,可以将其与返回的结果进行比较的意思是函数。

My_mean = [s(1)/s(2) s(3)/s(4)]
my_mean =1×27.1201 - 8.1310
m = gather(mean([tX tY]))
using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.56 sec
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数据集。这些数据包含了美国航班到达和离开时间的信息。从表中删除丢失的数据行并提取ArrDelayDepDelay一年变量。这些变量是数据集中每个航班的到达和起飞延迟以及相关年份的向量。

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

使用matlab.tall.reduce将两个函数应用到高桌子上。第一个函数结合了ArrDelayDepDelay变量,求每个航班的总平均延误。该函数确定每个数据块中有多少个独特的年份,然后对每年进行循环,并计算该年的航班平均总延误。结果是一个包含年份和平均总延迟的双变量表。这一中间数据需要进一步减少,以达到每年的平均延迟。将此函数保存在当前文件夹中为transform_fcn.m

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

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

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

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

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

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

d1 =收集(d1)
using the Local MATLAB Session: - Pass 1 of 1: Completed in 1.5 sec
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).

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

类型mySplitFcn
mySplitFcn(a,b,c) . mySplitFcn(a,b,c) . mySplitFcn(a,b,c)。减少(@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'});end函数TT = non_group_reduce_fcn(t) D = mean(t. meandelay);TT = table(t.Year(1),D,'VariableNames',{'Year' 'MeanDelay'});结束结束

调用findgroupssplitapply对数据进行操作并应用mySplitFcn对每组数据。

groups=findgroups(c);d2=splitapply(@mySplitFcn,a,b,c,groups);d2=gather(d2)
using the Local MATLAB Session: - Pass 1 of 2: Completed in 0.65 sec - Pass 2 of 2: Completed in 1.8 sec
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解决高数组还不支持的功能。万博1manbetx

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

rng默认的tX=高(兰特(1e4,1));p=兰特(1e4,1);tP=高(标准化(p,“规模”、sum (p)));

编写一个恒等函数,返回与输入相等的输出。这种方法跳过的转换步骤matlab.tall.reduce并将数据直接传递到约简步骤,在该步骤中反复应用约简函数来减小数据的大小。

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

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

类型weightedStats.m
function [wvar, wstd] = weightedStats(X, P) wvar = var(X,P);wstd =性病(X, P);结束

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

[tX_var_weighted, tX_std_weighted] = matlab.tall. txt . txt。减少(@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:20000:)y=tY(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并使用此命令查找最大值:
tA=matlab.toll.reduce(@sqInputs,@max,tX,tY)

例子:tC = matlab.tall.reduce (@numel @sum, tX,泰)查找每个块中的元素数量,然后对结果求和,计算元素总数。

数据类型:function_handle

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

的通用功能签名还原

[rA, rB, rC,…]= reducefcn(a, b, c, ...)
还原必须满足以下要求:

  1. 输入参数-输入[a, b, c,…]是适合于内存的块。这些数据块要么是由fcn,或部分减少的产量还原为了进一步缩小,正在再次动手术。输入[a, b, c,…]满足这些属性:

    • 输入[a, b, c,…]在第一个维度中具有相同的大小。

    • 对于第一个维度中的给定索引,数据块的每一行[a, b, c,…]来源于输入,或者来源于相同的前一个调用还原

    • 对于第一维中的给定索引,输入的每一行[a, b, c,…]因为该索引起源于第一个维度中的同一个索引。

  2. 输出参数——所有输出[rA, rB, rC,…]在第一个维度中必须有相同的大小。此外,它们必须与各自的输入垂直连接[a, b, c,…]必要时允许重复减少。

  3. 功能规则- - - - - -还原必须满足以下功能规则(至四舍五入错误):

    • F(输入)==F(F(输入)):对相同的输入重复应用该函数不会改变结果。

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

    • F ([input1;input2]) = = F ([F (input1);F (input2)]):将函数应用一次到一些中间结果的连接上,应该与单独应用它、连接它、再应用它相同。

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

合适的降维函数的一些示例是内置的降维函数,例如总和刺激最大值,等等。这些函数可以处理由生成的中间结果fcn并返回单个标量。这些函数具有这样的属性:连接发生的顺序和约简操作的次数不会改变最终的答案。一些函数,例如的意思是var,通常应避免作为还原函数,因为应用还原操作的次数可能会改变最终答案。

例子:tC = matlab.tall.reduce (@numel @sum tX)查找每个块中的元素数量,然后对结果求和,计算元素总数。

数据类型:function_handle

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

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

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

输出参数

全部崩溃

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

输出数组的大小和数据类型取决于指定的函数fcn还原.一般来说,输出助教,结核病,…必须与第一个输入具有相同的数据类型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)和(x,“omitnan”);s = matlab.tall。reduce(f, @(x) x, tX);s =收集(s)
S = 140467 101065 164355 135920 111182 186274 21321

介绍了R2018b