高数组是使用传统MATLAB处理大型数据集的一种强大、直观的方法®语法。然而,由于高数组操作的是数据块,每个数据块都可以单独放入内存,大多数函数的传统算法需要更新,以使用并行方法来支持高数组。金宝app本主题向您展示如何开发自己的并行算法来操作高数组。
目前,应用自定义函数到高数组的方法有:
无论您选择哪种操作,都有适用于所有方法的选项、性能注意事项和常见问题。
大多数常见的数学函数和MATLAB运算已经支持高数组。金宝app如果该功能已经得到支持,那么编写自己的算法可能就没有必要了。金宝app
下面是一些你可能想要为高数组实现自定义算法的原因:
实现当前不支持的函数金宝app-如果一个特定的函数目前不支持高数组,那么你可以使用这里概述的api来编写一个支持高数组的函金宝app数版本。
利用现有的代码-如果你有对内存数据执行一些操作的现有代码,那么只需要做少量的修改,你就可以使它兼容对高数组的操作。这种方法避免了转换代码以适应支持高数组的MATLAB语言子集的需要。金宝app
获得性能-例如,可以将MATLAB函数重写为c++ MEX函数,然后可以使用这里列出的api调用MEX函数来操作数据。
使用首选外部库-为了在组织内部兼容,有时需要使用特定的外部库进行特定的计算。您可以使用这里概述的api使用这些外部库重新实现函数。
受支持的金宝appapi用于高级用途,不包括广泛的输入检查。预期花费一些时间测试您实现的补充功能是否满足所有需求,并执行您预期的计算。这里列出了目前支持的金宝app用于编写高数组算法的api。
包函数名 | 描述 |
---|---|
matlab.tall.transform |
对一个或多个高数组的每个块应用指定的函数。 |
matlab.tall.reduce |
对一个或多个高数组的每个块应用指定的函数。然后将该函数的输出输入第二个简化函数。 |
matlab.tall.movingWindow |
对数据块应用移动窗口函数。 |
matlab.tall.blockMovingWindow |
对填充的数据块应用移动窗口函数和块缩减。 |
当您从数据存储创建一个高数组时,底层数据存储有助于在计算期间移动数据。数据以离散的方式移动,称为块,其中每个块是一组可以放入内存的连续行。例如,2-D数组(如表)的一个块是X (n: m:)
.的值为每个块的大小ReadSize
属性,但块的大小并不总是准确的。为了开发高数组算法,高数组被认为是许多这样的块的垂直连接。
给定数组的块是在运行时根据可用内存选择的,因此它们可以是动态的。因此,块可能不是完全每次运行的大小相同。如果您的计算机上有影响可用内存的更改,那么就会影响块的大小。
虽然本页仅指块和行在二维的意义上,这些概念扩展到N-D高数组。块大小仅在第一个维度受限制,因此块包含其他维度中的所有元素;例如,X (n: m,:,:,…)
.而且,与行不同,N-D数组具有片如X (p::,…)
.
的matlab.tall.transform
函数将单个函数应用于高数组的每个块,因此可以使用它应用按块进行转换、过滤或减少数据。例如,您可以删除具有特定值的行、对数据进行居中和缩放,或者检测某些条件并转换特定的数据片段。这些图显示了当数组中的块被操作时发生的情况matlab.tall.transform
.
操作 |
描述 | 例子 |
---|---|---|
|
转换—每个块的行数保持不变,但值改变。 |
|
|
过滤-每个块中的行数减少了,所以新数组中的块可能包括原来在其他块中出现的行。 |
|
应用单步转换的通用语法是
[tA, tB, tC,…]= matlab.tall.transform(fcn, tX, tY, tZ, ...)
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:20000:)
和y =泰(1:20000:)
.
如果任意一个的第一维[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的输入。当文件为空或对数据进行了大量过滤时,可能会出现空输入。
matlab.tall.reduce
将两个函数应用于高数组,将第一步的结果作为最终缩减步骤的输入输入。将约简函数反复应用于中间结果,直到获得一个适合内存的最终块。在MapReduce范式中,这个过程类似于“单键”MapReduce操作,中间结果都具有相同的键,并在还原步骤中合并。
第一步类似于matlab.tall.transform
有同样的要求。然而,减少步骤总是将中间结果减少到适合内存的单个块。这些图显示了当数组中的块被操作时发生的情况matlab.tall.reduce
.
操作 |
描述 | 例子 |
---|---|---|
|
减少转换+—每个块的行数在第一步后保持不变,然后中间结果减少到一个块。 |
|
|
减少过滤+—在第一步中减少每个块中的行数。然后将中间结果简化为一个块。 |
|
应用两步简化的通用语法是
[rA, rB, rC,…]= matlab.tall.reduce(fcn, reducefcn, tX, tY, tZ, ...)
的功能性签名fcn
是
[a, b, c,…]= fcn(x, y, z, ...)
的功能性签名reducefcn
是
[rA, rB, rC,…]= reducefcn(a, b, c, ...)
也就是输入高数组[tX, tY, tZ,…]
被分成几块[x, y, z,…]
它们是fcn
.然后,fcn
返回输出[a, b, c,…]
它们是reducefcn
.最后,reducefcn
返回最终结果(rA, rB, rC)
由matlab.tall.reduce
.
reducefcn
的要求fcn
是否与在fcn的功能需求.但是,要求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 (F(输入))
:对相同的输入重复应用该函数不会改变结果。
F ([input1;input2]) = = F ([input2;input1])
:结果不应依赖于连接的顺序。
F ([input1;input2]) = = F ([F (input1);F (input2)])
:将函数应用一次到一些中间结果的连接上,应该与单独应用它、连接它、再应用它相同。
空输入——确保reducefcn
可以处理高度为0的输入。当文件为空或对数据进行了大量过滤时,可能会出现空输入。对于这个调用,所有的输入块都是在第一个维度之外具有正确类型和大小的空数组。
的matlab.tall.movingWindow
和matlab.tall.blockMovingWindow
函数将函数应用于高数组中的数据窗口。而matlab.tall.transform
和matlab.tall.reduce
每次对整个数据块进行操作,当窗口从数组的开始移动到结束时,移动窗口函数对数据的窗口进行操作。窗口可以在从磁盘读取的数据块之间扩展。
这些图显示了当数组中的块被操作时发生的情况matlab.tall.movingWindow
或matlab.tall.blockMovingWindow
.
操作 | 描述 | 例子 |
---|---|---|
|
窗口的转换—每个块的行数保持不变,但值改变。输出包含对不完整和完整数据窗口执行操作的结果。 这两个 |
|
|
窗口的过滤—不完整的数据窗口被丢弃,因此输出的元素比输入的少。输出只包含在完整的数据窗口上执行操作的结果。 这两个 |
|
您可以使用matlab.tall.movingWindow
和matlab.tall.blockMovingWindow
对数据应用窗口转换或过滤器。例如,您可以计算一个跟踪平均值或一个移动中值,或者您可以对同一个窗口同时应用多个操作。这两个函数的不同之处在于:
matlab.tall.movingWindow
适用于fcn
对数据的所有Windows,不管Windows是否完整。matlab.tall.blockMovingWindow
适用于windowfcn
对不完整的数据窗口,并应用blockfcn
完成数据窗口。
matlab.tall.movingWindow
一次操作单个窗口的数据。matlab.tall.blockMovingWindow
操作包含多个完整窗口的整个数据块,这减少了计算中所需的函数调用数量。
将移动窗口操作应用于单个数据窗口的语法如下
[tA, tB, tC,…]= matlab.tall.movingWindow(fcn, window, tX, tY, tZ, ...)
的功能性签名fcn
必须
[a, b, c,…]= fcn(x, y, z, ...)
类似地,将移动窗口操作应用于整个数据块的语法如下
[tA, tB, tC,…]= matlab.tall.blockMovingWindow(windowfcn, blockfcn, window, tX, tY, tZ, ...)
的功能签名windowfcn
和blockfcn
必须
[a, b, c,…]= windowfcn(info, x, y, z, ...) [a, b, c, ...] = blockfcn(info, bX, bY, bZ, ...)
的信息
Input是一个包含字段的结构窗口
和步
.当你写函数的时候。使用这些字段在每个块中挑选数据窗口。
为一般规则的大纲fcn
,windowfcn
,blockfcn
必须遵循,看fcn的功能需求.除了信息
输入,fcn
和windowfcn
有相同的要求。但是,要求blockfcn
是不同的,因为该函数操作的是整个数据块。
windowfcn
的通用功能签名windowfcn
是
[a, b, c,…]= windowfcn(info, x, y, ...)
信息
Input是由matlab.tall.blockMovingWindow
包括以下字段:
步
-指定窗口之间的步长(默认为1)“步”
名称-值对。
窗口
—指定窗口大小。属性设置此值窗口
输入参数。
windowfcn
必须满足以下要求:
输入参数——输入[x, y, z,…]
是适合于内存的数据块。块是通过从各自的高数组输入中提取数据而产生的[tX, tY, tZ,…]
.输入[x, y, z,…]
满足这些属性:
所有的输入[x, y, z,…]
在第一个维度中有相同的大小。
数据块[x, y, z,…]
来自高维中的相同索引,假设高维中的高维数组是非单例的。例如,如果tX
和泰
如果非单例在高维中,那么第一组块可能是x = tX (1:20000:)
和y =泰(1:20000:)
.
当任意一个的第一维[tX, tY, tZ,…]
的大小1
,对应的块[x, y, z,…]
包含了那个大数组中的所有数据。
应用windowfcn
必须导致将输入数据缩减为高度为1的数组的标量或切片。
当输入是一个矩阵、N-D数组、表或时间表时,应用windowfcn
必须减少其每一列或变量中的输入数据。
输出参数——输出[a, b, c,…]
内存中的块是否被发送到各自的输出[tA, tB, tC,…]
.输出[a, b, c,…]
满足这些属性:
所有的输出[a, b, c,…]
在第一个维度中必须有相同的大小。
所有的输出[a, b, c,…]
是否与之前调用的结果垂直连接windowfcn
.
所有的输出[a, b, c,…]
发送到各自目标输出数组的第一个维度中的相同索引。
功能规则- - - - - -windowfcn
必须满足以下功能规则:
F ([inputs1;inputs2]) = = (F (inputs1);F (inputs2))
:将函数应用于连接输入,应该与将函数分别应用于输入,然后连接结果相同。
blockfcn
的通用功能签名blockfcn
是
[a, b, c,…]= blockfcn(info, bX, bY, bZ, ...)
信息
Input是由matlab.tall.blockMovingWindow
包括以下字段:
步
-指定窗口之间的步长(默认为1)“步”
名称-值对。
窗口
—指定窗口大小。属性设置此值窗口
输入参数。
数据块bX, bY, bZ,…
那matlab.tall.blockMovingWindow
提供给blockfcn
这些属性:
这些街区只有全尺寸的窗户。blockfcn
不需要为不完整的数据窗口定义行为。
数据的第一个窗口从块的第一个元素开始。最后一个窗口的最后一个元素就是块的最后一个元素。
blockfcn
必须满足以下要求:
输入参数——输入[bX, bY, bZ,…]
是适合于内存的数据块。块是通过从各自的高数组输入中提取数据而产生的[tX, tY, tZ,…]
.输入[bX, bY, bZ,…]
满足这些属性:
所有的输入[bX, bY, bZ,…]
在任何允许的扩展后,在第一个维度中有相同的尺寸。
数据块[bX, bY, bZ,…]
来自高维中的相同索引,假设高维中的高维数组是非单例的。例如,如果tX
和泰
如果非单例在高维中,那么第一组块可能是bX = tX (1:20000:)
和通过=泰(1:20000:)
.
任何数据输入的第一个维度[tX, tY, tZ,…]
的大小1
,然后是相应的块[bX, bY, bZ,…]
包含了那个大数组中的所有数据。
应用blockfcn
必须导致输入数据的减少,以便结果的高度等于块中的窗口数。您可以使用信息。窗口
和信息。步
确定块中窗口的数量。
如果输入是一个矩阵、N-D数组、表或时间表,则应用blockfcn
必须减少其每一列或变量中的输入数据。
输出参数——输出[a, b, c,…]
块是否适合内存,要发送到各自的输出[tA, tB, tC,…]
.输出[a, b, c,…]
满足这些属性:
所有的输出[a, b, c,…]
在第一个维度中必须有相同的大小。
所有的输出[a, b, c,…]
是否与之前调用的结果垂直连接blockfcn
.
所有的输出[a, b, c,…]
发送到各自目标输出数组的第一个维度中的相同索引。
功能规则- - - - - -blockfcn
必须满足以下功能规则:
F ([inputs1;inputs2]) = = (F (inputs1);F (inputs2))
:将函数应用于连接输入,应该与将函数分别应用于输入,然后连接结果相同。
的最终输出金宝app支持api有与输入不同的数据类型,那么呢必须指定“OutputsLike”
名称-值对提供一个或多个原型数组,这些原型数组具有与相应输出相同的数据类型和属性。的价值“OutputsLike”
始终是单元格数组,每个单元格包含对应输出参数的原型数组。
例如,这个调用matlab.tall.transform
接受一个大数组tX
作为输入,并返回两个由原型数组指定的不同类型的输出protoA
和protoB
.输出一个
具有相同的数据类型和属性protoA
,对于B
和protoB
.
C = {protoA protoB};[标准答案][A, B]转换(fcn, tX, 'OutputsLike', C)
提供原型数组的常用方法是调用fcn
使用适当数据类型的普通输入,因为fcn
拥有正确的数据类型。在本例中,transform函数接受一个tall double,但返回一个tall表。通过调用fcn (0)
而原型被指定为值“OutputsLike”
.
ds = tabularTextDatastore(“airlinesmall.csv”、“TreatAsMissing”、“NA”);ds。SelectedVariableNames = {'ArrDelay', 'DepDelay'};tt =高(ds);tX = tt.ArrDelay;fcn = @(x) table(x,'VariableNames',{'MyVar'});proto_A = fcn (0);= matlab.tall.transform (fcn tX, OutputsLike, {proto_A});
将所有分析放在一个函数中,您可以直接调用该函数对数据进行操作,而不是使用不必要的嵌套函数。
使用数据的一小部分进行实验。分析代码,在扩展到整个数据集之前找到并修复瓶颈,在整个数据集中,瓶颈可能会被极大地放大。
注意数据的方向,因为有些函数根据输入数据返回不同形状的输出。例如,独特的
可以根据输入数据的方向返回行向量或列向量。
块是在运行时根据可用的计算机内存动态生成的。确保任何指定的约简函数都符合函数规则F ([input1;input2]) = = F ([F (input1);F (input2)])
.如果不遵守这条规则,那么在不同的试验中结果会有很大的不同。
块在第一个维度中可以有任何大小,包括0或1。大小0或1可能出现在中间计算中,作为过滤或缩减操作的结果。确保你的函数对这两种情况都做了正确的事情。当您收到“Output is different size”错误消息时,该函数不能正确处理这些情况。
matlab.tall.blockMovingWindow
|matlab.tall.movingWindow
|matlab.tall.reduce
|matlab.tall.transform