主要内容

开发自定义高数组算法

高数组是使用传统MATLAB处理大型数据集的一种强大、直观的方法®语法。然而,由于高数组操作的是数据块,每个数据块都可以单独放入内存,大多数函数的传统算法需要更新,以使用并行方法来支持高数组。金宝app本主题向您展示如何开发自己的并行算法来操作高数组。

目前,应用自定义函数到高数组的方法有:

无论您选择哪种操作,都有适用于所有方法的选项、性能注意事项和常见问题。

实现自定义算法的原因

大多数常见的数学函数和MATLAB运算已经支持高数组。金宝app如果该功能已经得到支持,那么编写自己的算法可能就没有必要了。金宝app

下面是一些你可能想要为高数组实现自定义算法的原因:

  • 实现当前不支持的函数金宝app-如果一个特定的函数目前不支持高数组,那么你可以使用这里概述的api来编写一个支持高数组的函金宝app数版本。

  • 利用现有的代码-如果你有对内存数据执行一些操作的现有代码,那么只需要做少量的修改,你就可以使它兼容对高数组的操作。这种方法避免了转换代码以适应支持高数组的MATLAB语言子集的需要。金宝app

  • 获得性能-例如,可以将MATLAB函数重写为c++ MEX函数,然后可以使用这里列出的api调用MEX函数来操作数据。

  • 使用首选外部库-为了在组织内部兼容,有时需要使用特定的外部库进行特定的计算。您可以使用这里概述的api使用这些外部库重新实现函数。

金宝app支持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

操作

描述

例子

转换—每个块的行数保持不变,但值改变。

  • 一个= matlab.tall。变换(@sin tX)计算每个块中元素的正弦值。

  • A = matlab.tall.transform(@(X) X ^2, tX)将每个块中的元素平方。

过滤-每个块中的行数减少了,所以新数组中的块可能包括原来在其他块中出现的行。

  • A = matlab.tall.transform(@(X) topkrows(X,5), tX)从每个块中只提取前5行,过滤掉其他行。

  • 一个= matlab.tall。变换(@sum tX)计算每个块中元素的和,将每个块减少为一个标量。元素的数量一个等于方块的数量。

转换语法

应用单步转换的通用语法是

[tA, tB, tC,…]= matlab.tall.transform(fcn, tX, tY, tZ, ...)

功能要求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 =泰(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的输入。当文件为空或对数据进行了大量过滤时,可能会出现空输入。

两步还原操作

matlab.tall.reduce将两个函数应用于高数组,将第一步的结果作为最终缩减步骤的输入输入。将约简函数反复应用于中间结果,直到获得一个适合内存的最终块。在MapReduce范式中,这个过程类似于“单键”MapReduce操作,中间结果都具有相同的键,并在还原步骤中合并。

第一步类似于matlab.tall.transform有同样的要求。然而,减少步骤总是将中间结果减少到适合内存的单个块。这些图显示了当数组中的块被操作时发生的情况matlab.tall.reduce

操作

描述

例子

减少转换+—每个块的行数在第一步后保持不变,然后中间结果减少到一个块。

  • = matlab.tall.reduce (@sin @max tX)计算每个值块的正弦值,然后在缩减步骤中找到总的最大值。

  • A = matlab.tall.reduce(@(X) X ^2, @mean, tX)对每个块中的元素进行平方,然后计算约简步骤中的总体均值。

减少过滤+—在第一步中减少每个块中的行数。然后将中间结果简化为一个块。

  • 一个= matlab.tall。减少(@sum @sum tX)计算每个块中元素的和,然后找到缩减步骤中元素的总体和。

  • A = matlab.tall.reduce(@(X) X(X>0), @mean, tX)过滤掉所有的负数,然后计算剩余值的总体平均值。

减少语法

应用两步简化的通用语法是

[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必须满足以下要求:

  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 ([input1;input2]) = = F ([input2;input1]):结果不应依赖于连接的顺序。

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

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

滑动窗口的操作

matlab.tall.movingWindowmatlab.tall.blockMovingWindow函数将函数应用于高数组中的数据窗口。而matlab.tall.transformmatlab.tall.reduce每次对整个数据块进行操作,当窗口从数组的开始移动到结束时,移动窗口函数对数据的窗口进行操作。窗口可以在从磁盘读取的数据块之间扩展。

这些图显示了当数组中的块被操作时发生的情况matlab.tall.movingWindowmatlab.tall.blockMovingWindow

操作 描述 例子

窗口的转换—每个块的行数保持不变,但值改变。输出包含对不完整和完整数据窗口执行操作的结果。

这两个matlab.tall.movingWindowmatlab.tall.blockMovingWindow转换数据时“端点”默认值是“缩水”,或指定填充值时。这两个值确保输出在第一个维度中的大小与输入相同。

  • 一个= matlab.tall。movingWindow(100年@mean tX)使用100的窗口大小计算移动平均值。

窗口的过滤—不完整的数据窗口被丢弃,因此输出的元素比输入的少。输出只包含在完整的数据窗口上执行操作的结果。

这两个matlab.tall.movingWindowmatlab.tall.blockMovingWindow删除不完整的窗口的数据“端点”“丢弃”

  • 一个= matlab.tall。movingWindow(@mean, 100, tX, 'EndPoints', 'discard')计算数据的完整窗口的移动平均值,使用窗口大小为100。

您可以使用matlab.tall.movingWindowmatlab.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, ...)

的功能签名windowfcnblockfcn必须

[a, b, c,…]= windowfcn(info, x, y, z, ...) [a, b, c, ...] = blockfcn(info, bX, bY, bZ, ...)

信息Input是一个包含字段的结构窗口.当你写函数的时候。使用这些字段在每个块中挑选数据窗口。

为一般规则的大纲fcnwindowfcn,blockfcn必须遵循,看fcn的功能需求.除了信息输入,fcnwindowfcn有相同的要求。但是,要求blockfcn是不同的,因为该函数操作的是整个数据块。

功能要求windowfcn

的通用功能签名windowfcn

[a, b, c,…]= windowfcn(info, x, y, ...)
信息Input是由matlab.tall.blockMovingWindow包括以下字段:

  • -指定窗口之间的步长(默认为1)“步”名称-值对。

  • 窗口—指定窗口大小。属性设置此值窗口输入参数。

windowfcn必须满足以下要求:

  1. 输入参数——输入[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必须减少其每一列或变量中的输入数据。

  2. 输出参数——输出[a, b, c,…]内存中的块是否被发送到各自的输出[tA, tB, tC,…].输出[a, b, c,…]满足这些属性:

    • 所有的输出[a, b, c,…]在第一个维度中必须有相同的大小。

    • 所有的输出[a, b, c,…]是否与之前调用的结果垂直连接windowfcn

    • 所有的输出[a, b, c,…]发送到各自目标输出数组的第一个维度中的相同索引。

  3. 功能规则- - - - - -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必须满足以下要求:

  1. 输入参数——输入[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必须减少其每一列或变量中的输入数据。

  2. 输出参数——输出[a, b, c,…]块是否适合内存,要发送到各自的输出[tA, tB, tC,…].输出[a, b, c,…]满足这些属性:

    • 所有的输出[a, b, c,…]在第一个维度中必须有相同的大小。

    • 所有的输出[a, b, c,…]是否与之前调用的结果垂直连接blockfcn

    • 所有的输出[a, b, c,…]发送到各自目标输出数组的第一个维度中的相同索引。

  3. 功能规则- - - - - -blockfcn必须满足以下功能规则:

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

控制输出数据类型

的最终输出金宝app支持api有与输入不同的数据类型,那么呢必须指定“OutputsLike”名称-值对提供一个或多个原型数组,这些原型数组具有与相应输出相同的数据类型和属性。的价值“OutputsLike”始终是单元格数组,每个单元格包含对应输出参数的原型数组。

例如,这个调用matlab.tall.transform接受一个大数组tX作为输入,并返回两个由原型数组指定的不同类型的输出protoAprotoB.输出一个具有相同的数据类型和属性protoA,对于BprotoB

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”错误消息时,该函数不能正确处理这些情况。

另请参阅

|||

相关的话题