主要内容

高数组的递延求值

高阵列和内存MATLAB之间的差异之一®阵列是高大的阵列通常仍然存在未约名直到你要求执行计算为止。(该规则的例外包括绘图函数,如情节直方图还有一些统计拟合函数fitlm,它会自动计算高数组输入。)当一个tall数组处于未求值状态时,MATLAB可能不知道它的大小、它的数据类型或它包含的具体值。但是,您仍然可以在计算中使用未计算的数组,就好像这些值是已知的一样。这允许您快速处理大型数据集,而不是等待每个命令的执行。因此,建议您使用收集仅当您需要输出时。

MATLAB跟踪所有的操作,你执行未评估的高大数组,因为你输入他们。当你最终打电话收集为了计算排队的操作,MATLAB使用未计算命令的历史,通过最小化通过数据的次数来优化计算。如果使用得当,通过消除对大型数据集的不必要传递,这种优化可以节省大量的执行时间。

显示未评估的高阵列

未评估的高数组的显示取决于MATLAB对数组及其值的了解程度。展示中反映了三条信息:

  • 数组大小-未知尺寸由变量表示或者N在显示屏中。如果没有已知维度尺寸,则大小将显示为mxnx ....

  • 数组数据类型- 如果数组有一个未知的底层数据类型,那么它的类型就会出现高大的数组.如果类型已知,则将其列示为,例如:高大的双阵列

  • 数组值- 如果数组值未知,则它们显示为.显示已知值。

根据计算的性质,Matlab可能知道关于给定的高阵列的一些信息,其中一些信息。

例如,如果数组的数据类型是已知的,但大小和值是未知的,那么未求值的tall数组可能是这样的:

m×n×...高双数组???......???......???... :::::::::::

如果已知类型和相对大小,则显示屏可能是:

1×n高焦炭阵列???...

如果一些数据是已知的,则MATLAB显示已知值:

100×3高双矩阵0.8147 0.1147 0.6443 0.9058 0.7943 0.3786 0.1270 0.3112 0.8116 0.9134 0.5285 0.5328 0.5285 0.5328 0.5285 0.5328 0.6324 0.1656 0.3507 0.0975 0.6020 0.9390 0.2785 0.2630 0.8759 0.5469 0.6541 0.5502 ::::::::::::0.5502 0.6541 0.5502

评估与收集

收集功能用于评估高阵列。收集接受高阵列作为输入并将内存阵列返回为输出。因此,您可以将此功能视为高阵列和内存阵列之间的桥梁。例如,您无法控制如果或者尽管使用高逻辑阵列的循环语句,但是一旦阵列进行了评估收集它成为可以在这些上下文中使用的内存内存逻辑值。

收集在高阵列上执行所有排队的操作并返回全部的导致内存。自从收集将结果作为内存MATLAB阵列返回,标准内存注意事项适用。如果返回的结果返回,Matlab可能会耗尽内存收集太大。

大多数时候你可以使用收集查看计算的全部结果,特别是当计算包含诸如总和或者意思.但是,如果结果太大而无法放入内存,则可以使用收集(头(X))或者收集(尾部(x))执行计算并仅查看结果的第一个或最后一行。

解决错误与收集

如果输入错误的命令和收集未能计算高数组变量,则必须从工作区中删除该变量并使用该变量重新创建高数组只要有效命令。这是因为在进入它们时,Matlab跟踪您在未评估的高阵列上执行的所有操作。使MATLAB“忘记”关于错误陈述的唯一方法是从头开始重建高阵列。

示例:计算高阵列的大小

这个例子展示了一个未求值的tall数组是什么样子的,以及如何求值这个数组。

为数据集创建数据存储Airlinesmall.csv..将数据存储区转换为高表,然后计算大小。

varnames = {'arrdelay',“DepDelay”,'起源','dest'};ds = tabularTextDatastore ('airlinesmall.csv',“TreatAsMissing”,'na',...'selectedvariablenames',varnames);tt =高(DS)
tt =米×4表ArrDelay DepDelay起源服务台  ________ ________ ______ _____ 8 12“宽松”的SJC 8 1“SJC”“钻”21日20‘圣’的SMF 13 12“钻”“SJC”4 1 SMF的“宽松”59 63“宽松”的SJC 3 2“圣”“旧金山”11 1“海”的松懈 ' : : : : : : : :
s = size(tt)
S = 1×2高双行向量??预览延期。学习更多的知识。

计算一个高数组的大小将返回一个小的答案(一个1乘2的向量),但是显示表明仍然需要通过整个数据来计算的大小tt

使用收集功能要完全评估高阵列并将结果带入内存中。当命令执行时,在命令窗口中存在动态进度显示,这些在命令窗口中具有特别有用的计算。

请注意

一定要确保返回的结果是收集就能装进内存了。如果你使用收集直接在高大的阵列上使用诸如的函数减少其尺寸意思,则MATLAB可能会耗尽内存。

tablesize =聚集(s)
using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.42 sec Evaluation Completed in 0.48 sec tableSize = 123523

示例:使用高数组的多遍计算

此示例显示了如何组合若干计算,以最小化通过数据的通过的总数。

为数据集创建数据存储Airlinesmall.csv..将数据存储转换为高表。

varnames = {'arrdelay',“DepDelay”,'起源','dest'};ds = tabularTextDatastore ('airlinesmall.csv',“TreatAsMissing”,'na',...'selectedvariablenames',varnames);tt =高(DS)
tt =米×4表ArrDelay DepDelay起源服务台  ________ ________ ______ _____ 8 12“宽松”的SJC 8 1“SJC”“钻”21日20‘圣’的SMF 13 12“钻”“SJC”4 1 SMF的“宽松”59 63“宽松”的SJC 3 2“圣”“旧金山”11 1“海”的松懈 ' : : : : : : : :

减去平均值DEPDELAYarrdelay.创建一个新变量adjanrdelay.然后计算平均值adjanrdelay然后减去这个平均值adjanrdelay.如果这些计算都是单独评估的,那么MATLAB将需要对数据进行四次遍历。

AddArrdelay = TT.Arrdelay  - 平均值(tt.depdelay,“omitnan”);adjarrdelay = adjarrdelay  - 意思(adjanrdelay,“omitnan”
adjarrdelay = m×1高双柱矢量???::预览推迟。学习更多的知识。

评估adjanrdelay并查看前几行。因为有些计算可以合并,所以只需要对数据进行三次传递。

收集(头(AdjArrDelay))
使用本地MATLAB会话计算高表达式:-通过3次:在0.4秒完成-通过2次:在0.39秒完成-通过3次:在0.23秒完成评估在1.2秒完成ans = 0.8799 0.8799 13.8799 5.8799 -3.1201 51.8799 -4.1201 3.8799

行为和建议摘要

  1. 长数组将保持未求值,直到使用收集

  2. 收集在大多数情况下,计算高数组。如果您认为计算结果可能不适合内存,那么使用收集(头(X))或者收集(尾部(x))代替。

  3. 主要使用未计算的高数组,只在必要时输出请求。未计算的队列计算越多,MATLAB就可以做越多的优化来最小化通过数据的次数。

  4. 如果输入错误的高阵列命令和收集未能计算高数组变量,则必须从工作区中删除该变量并使用该变量重新创建高数组只要有效命令。

另请参阅

|

相关话题