文档

开发自定义高阵列算法

高大的数组是一个强大的、直观的方式使用传统MATLAB处理大型数据集®语法。然而,由于高数组操作的数据块,每个单独适合记忆,大多数功能的传统算法需要更新使用并行方法来支持高数组。金宝app这个话题向您展示如何开发自己的并行算法操作高数组。

目前可用的方法定制函数应用到高数组:

无论你选择哪个操作,有选择,性能考虑,常见问题,适用于所有的方法。

实现自定义算法的原因

最常见的数学函数和MATLAB操作已经支持高数组。金宝app如果功能已经支持,然后编写自己的算法可能不是必要的。金宝app

这里有一些原因你可能想要实现一个自定义算法高数组:

  • 实现目前不支持的功能金宝app——如果一个特定的功能目前不支持高数组,你可以使用这里列出的api来编写函数的一个版本,支持金宝app高数组。

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

  • 获得性能——例如,您可以重写一个MATLAB函数作为一个c++墨西哥人功能,然后您可以使用这些api概述了墨西哥人的函数调用来操作数据。

  • 使用首选的外部库——组织内部的兼容性有时需要使用特定的外部库对某些计算。您可以使用这些api概述与外部库来重新实现一个函数。

金宝app支持api

支持的a金宝apppi仅用于先进的和不包括广泛的输入检查。希望花一些时间测试的补充功能实现满足所有需求和执行计算你期望。目前支持的api编写金宝app高数组算法列在这里。

包函数名 描述
matlab.tall.transform 应用函数每个块指定一个或多个高数组。
matlab.tall.reduce 应用函数每个块指定一个或多个高数组。然后提要输出的函数在如何减少第二个函数。
matlab.tall.movingWindow 运用移动窗口函数的数据块。
matlab.tall.blockMovingWindow

运用移动窗口功能和减少块垫块的数据。

背景:高阵列块

当您创建一个高大从数据存储阵列,底层数据存储便于计算期间的运动数据。离散的数据移动棋子,每个块是一组连续的行可以装入内存。例如,一个块的一个二维数组(如表)X (n: m:)。每个块的大小是基于价值的ReadSize房地产的数据存储,但块并不总是准确的大小。为了发展高阵列算法,一个高大的数组被认为是许多这样的块的垂直连接。

选择一个给定数组的块在运行时基于可用的内存,所以他们可以是动态的。因此,可能不是完全运行之间的大小相同。如果你有变化影响可用内存的计算机上,然后可以影响大小的块。

尽管这仅指页二维来说,这些概念扩展到天高数组。块大小只限制在第一维度,所以其他维度的块包括所有元素;例如,X (n: m,:,:,…)。也,而不是行,一天数组X (p::,…)

单步执行转换操作

matlab.tall.transform函数一个函数适用于每一块高大的数组,所以你可以用它来应用一个基于块变换,数据的过滤,或减少。例如,您可以删除与特定的行值,数据中心和规模,或发现某些特定条件和变换的数据。这些数据显示块数组中发生了什么当他们动手术matlab.tall.transform

操作

描述

例子

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

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

  • 一个= matlab.tall.transform (@ X (X)。^ 2,tX)在每个块正方形的元素。

过滤——每个块中的行数减少,所以新数组中的块可能包括行最初出现在其他模块。

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

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

转换语法

通用语法应用单步变换

(助教、结核,tC,…)= matlab.tall.transform(fcn, tX, tY, tZ, ...)

功能要求fcn

一般功能的签名fcn

(a, b, c,……)= fcn(x, y, z, ...)
fcn必须满足这些要求:

  1. 输入参数——输入(x, y, z,……)是装入内存的数据块。从各自的提取数据产生的块高输入数组(tX,泰,tZ,…)。输入(x, y, z,……)满足这些属性:

    • 所有的(x, y, z,……)有相同的大小在任何允许扩张后的第一个维度。

    • 的数据块(x, y, z,……)来自同一指数在高维度,假设高数组nonsingleton在高维度。例如,如果tXnonsingleton在高维度,那么第一组块可以吗x = tX (1:20000:)y =泰(1:20000:)

    • 如果第一个维度的(tX,泰,tZ,…)有一个大小1,那么相应的块(x, y, z,……)包括高数组中的所有数据。

  2. 输出参数——输出(a, b, c,……)是装入内存块,发送给相应的输出(助教、结核,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)计算每个块的正弦值,然后发现整体最大值在减少步骤。

  • 一个= matlab.tall.reduce (@ X (X)。^ 2 @mean tX)广场的元素在每一块,然后计算出总体的意思是减少步骤。

减少过滤+——每个块中的行数减少的第一步。然后中间结果减少到一个街区。

  • 一个= matlab.tall。减少(@sum @sum tX)计算每个块元素之和,然后发现元素的整体和还原的步骤。

  • 一个= 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,泰,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,…)必须具有相同的大小在第一维度。此外,他们必须垂直concatenable与各自的输入(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功能函数适用于windows的数据在一个高大的数组。而matlab.tall.transformmatlab.tall.reduce操作所有的数据块,移动窗函数运行在windows上的数据作为一个窗口从数组的开始到结束。间的窗户可以跨越从磁盘读取的数据块。

这些数据显示块数组中发生了什么当他们动手术matlab.tall.movingWindowmatlab.tall.blockMovingWindow

操作 描述 例子

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

这两个matlab.tall.movingWindowmatlab.tall.blockMovingWindow转换数据时“端点”的默认值吗“缩水”,或者当一个填补值是确定的。两个值保证输出是相同的大小在第一维度作为输入。

  • 一个= matlab.tall。movingWindow(100年@mean tX)计算一个移动的意思是使用一个窗口大小为100。

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

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

  • 一个= matlab.tall。tX movingWindow (@mean, 100年,“端点”、“丢弃”)计算一个移动的意思是完整的窗户上的数据,使用一个窗口大小为100。

您可以使用matlab.tall.movingWindowmatlab.tall.blockMovingWindow应用窗口的数据转换或过滤器。例如,您可以计算平均或移动平均,或者你可以申请几个操作相同的窗口。这两个函数在这些方面有所不同:

  • matlab.tall.movingWindow适用于fcn所有窗口的数据,无论窗户都完成了。matlab.tall.blockMovingWindow适用于windowfcn不完整的数据窗口,适用blockfcn完成窗口的数据。

  • matlab.tall.movingWindow作用于单一窗口的数据。matlab.tall.blockMovingWindow作用于整个完整的数据块包含多个窗口,减少了函数调用的数量要求的计算。

移动窗口语法

语法运用移动窗口操作的单一窗口的数据

(助教、结核,tC,…)= matlab.tall.movingWindow(fcn, window, tX, tY, tZ, ...)

的功能签名fcn必须

(a, b, c,……)= fcn(x, y, z, ...)

同样,语法运用移动窗口操作整个的数据块

(助教、结核,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, ...)

信息输入是一个结构,包含的字段窗口。当您编写的函数。使用这些字段来挑选的窗户每个块中的数据。

对于一个概述的一般规则fcn,windowfcn,blockfcn必须遵循,看fcn功能要求。除了信息输入,fcnwindowfcn有相同的需求。然而,的要求blockfcn因为不同函数作用于整个的数据块。

功能要求windowfcn

一般功能的签名windowfcn

(a, b, c,……)= windowfcn(info, x, y, ...)
信息提供的输入是一个结构matlab.tall.blockMovingWindow这些领域包括:

  • 窗口之间——指定步长(默认值:1),设置这个值“步”名称-值对。

  • 窗口——指定的窗口大小。设置这个值窗口输入参数。

windowfcn必须满足这些要求:

  1. 输入参数——输入(x, y, z,……)是装入内存的数据块。从各自的提取数据产生的块高输入数组(tX,泰,tZ,…)。输入(x, y, z,……)满足这些属性:

    • 所有的输入(x, y, z,……)有相同的尺寸在第一维度。

    • 的数据块(x, y, z,……)来自同一指数在高维度,假设高数组nonsingleton在高维度。例如,如果tXnonsingleton在高维度,那么第一组块可以吗x = tX (1:20000:)y =泰(1:20000:)

    • 当第一个维度的(tX,泰,tZ,…)有一个大小1,相应的块(x, y, z,……)包括高数组中的所有数据。

    • 应用windowfcn必须导致减少输入数据的一个标量或一片数组身高1。

      当输入一个矩阵,一天数组,表,或时间表,应用windowfcn必须减少导致的输入数据在每一个列或变量。

  2. 输出参数——输出(a, b, c,……)是装入内存块发送给各自的输出(助教、结核,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, ...)
信息提供的输入是一个结构matlab.tall.blockMovingWindow这些领域包括:

  • 窗口之间——指定步长(默认值:1),设置这个值“步”名称-值对。

  • 窗口——指定的窗口大小。设置这个值窗口输入参数。

的数据块bX,,,…matlab.tall.blockMovingWindow提供给blockfcn这些属性:

  • 模块只包含全尺寸的窗口。blockfcn没有定义一个行为数据的不完整的windows。

  • 第一个窗口的数据从第一个元素开始的块。最后一个窗口的最后一个元素的最后一个元素是块。

blockfcn必须满足这些要求:

  1. 输入参数——输入(bX,,,……)是装入内存的数据块。从各自的提取数据产生的块高输入数组(tX,泰,tZ,…)。输入(bX,,,……)满足这些属性:

    • 所有的输入(bX,,,……)有相同的大小在任何允许扩张后的第一个维度。

    • 的数据块(bX,,,……)来自同一指数在高维度,假设高数组nonsingleton在高维度。例如,如果tXnonsingleton在高维度,那么第一组块可以吗bX = tX (1:20000:)通过=泰(1:20000:)

    • 如果第一个维度的数据输入(tX,泰,tZ,…)有一个大小1,那么相应的块(bX,,,……)包括高数组中的所有数据。

    • 应用blockfcn必须导致减少输入数据,这样结果高度等于窗户的数量。您可以使用info.Windowinfo.Stride确定数量的窗户在一块。

      如果输入是一个矩阵,一天数组,表,或时间表,然后应用blockfcn必须减少导致的输入数据在每一个列或变量。

  2. 输出参数——输出(a, b, c,……)是装入内存块,发送给相应的输出(助教、结核,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] = matlab.tall。变换(fcn、tX OutputsLike, C)

供应原型数组的一种常见方法是调用fcn简单的输入适当的数据类型,因为返回的输出fcn有正确的数据类型。在这个例子中,变换函数接受一个高两倍,但返回一个高大的表。一个原型是通过调用生成的数组fcn (0)和的值被指定为原型“OutputsLike”

ds = tabularTextDatastore (“airlinesmall.csv”、“TreatAsMissing”、“NA”);ds。SelectedVariableNames = {‘ArrDelay’,‘DepDelay};tt =高(ds);tX = tt.ArrDelay;fcn = @ (x)表(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可以发生在中间计算结果的过滤或减少操作。确保你的函数对这两种情况下做正确的事情。一个迹象表明函数不妥善处理这些情况是当你收到一个错误消息输出是不同的大小。

另请参阅

|||

相关的话题