matlab.tall.reduce
通过对数据块应用约简算法来减少数组
语法
描述
例子
应用归约函数到高向量
创建一个高表,从该表中提取一个高向量,然后查找该向量中的元素总数。
创建一个高的桌子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
- - - - - -转换函数以应用
函数处理|匿名函数
将函数转换为应用,指定为函数句柄或匿名函数。的每个输出fcn
必须与第一个输入的类型相同tX
.您可以使用“OutputsLike”
选项返回不同数据类型的输出。如果fcn
返回多个输出,则所有输出必须具有相同的高度。
的一般功能签名fcn
是
[a, b, c,…]= fcn(x, y, z, ...)
fcn
必须满足这些要求:
输入参数-输入
[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,…]
由高数组中的所有数据组成。
输出参数-输出
[a, b, c,…]
是块,适合在内存中,被发送到各自的输出[tA, tB, tC,…]
.输出[a, b, c,…]
满足以下属性:所有的
[a, b, c,…]
必须在第一维度中有相同的大小。所有的
[a, b, c,…]
是否垂直连接到之前调用的各自结果fcn
.所有的
[a, b, c,…]
发送到各自目标输出数组中第一个维度中的相同索引。
功能规则- - - - - -
fcn
必须满足函数规则:F ([inputs1;inputs2) == [F(inputs1);F (inputs2))
:将函数应用于输入的连接应该与将函数分别应用于输入,然后将结果连接相同。
空输入-确保
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
- - - - - -应用约简函数
函数处理|匿名函数
要应用的还原函数,指定为函数句柄或匿名函数。的每个输出reducefcn
必须与第一个输入的类型相同tX
.您可以使用“OutputsLike”
选项返回不同数据类型的输出。如果reducefcn
返回多个输出,则所有输出必须具有相同的高度。
的一般功能签名reducefcn
是
[rA, rB, rC,…]= reducefcn(a, b, c, ...)
reducefcn
必须满足这些要求:
输入参数-输入
[a, b, c,…]
是适合内存的块。数据块是返回的输出fcn
,或部分减少输出reducefcn
现在正在进行进一步的手术。输入[a, b, c,…]
满足以下属性:输入
[a, b, c,…]
在第一维中有相同的尺寸。对于第一维中给定的索引,表示数据块的每一行
[a, b, c,…]
要么来自于输入,要么来自于之前对的相同调用reducefcn
.对于第一维中给定的下标,每一行的输入
[a, b, c,…]
因为该索引起源于第一维中的相同索引。
输出参数-所有输出
[rA, rB, rC,…]
必须在第一维度中有相同的大小。此外,它们必须与各自的输入垂直连接[a, b, c,…]
允许在必要时重复削减。功能规则- - - - - -
reducefcn
必须满足这些函数规则(直到舍入错误):F(input) == F(F(input))
:对相同的输入重复应用该函数不会改变结果。F ([input1;input2) == F([input2;input1])
:结果不应取决于串联的顺序。F ([input1;input2) == F([F(input1);F (input2)])
:将函数应用于某些中间结果的拼接一次应该与分别应用它、拼接并再次应用它相同。
空输入-确保
reducefcn
可以处理高度为0的输入。当文件为空或对数据进行了大量过滤时,可能会出现空输入。对于这个调用,所有输入块都是正确类型和大小的空数组,维度大于第一个。
一些合适的降维函数的例子是内置的降维函数,例如总和
,刺激
,马克斯
等等。这些函数可以作用于由fcn
并返回单个标量。这些函数具有这样的属性,即连接发生的顺序和应用约简操作的次数不会改变最终答案。一些函数,例如的意思是
而且var
,一般应避免作为约简函数,因为应用约简操作的次数可能会改变最终答案。
例子:tC = matlab.tall.reduce(@numel,@sum,tX)
找出每个块中的元素数量,然后将结果相加以计算元素的总数。
数据类型:function_handle
tX
,泰
- - - - - -输入数组
标量|向量|矩阵|多维数组
输入数组,指定为标量、向量、矩阵或多维数组。输入数组用作转换函数的输入fcn
.每个输入数组tX,泰,…
必须有兼容的高度。当两个输入具有相同的高度时,或者当一个输入的高度为1时,它们具有兼容的高度。
巴勒斯坦权力机构
,PB
- - - - - -输出数组原型
数组
输出数组的原型,指定为数组。当你指定“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中引入
第一MATLAB
海脂循环匹配函数对应求解MATLAB:
Esegui il commanmando inserendolo nella finestra di commanmando MATLAB。我的浏览器web不支持和MATLAB金宝app。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。