主要内容

高数组的递延求值

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

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

显示未计算的高数组

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

  • 数组大小-未知尺寸由变量表示N在显示。如果不知道尺寸大小,则尺寸显示为MxNx……

  • 数组数据类型—如果数组有未知的基础数据类型,则其类型显示为高大的数组.如果类型已知,则将其列示为,例如:高双数组

  • 数组的值—如果数组值未知,则显示为.显示已知值。

MATLAB可能知道关于给定高数组的所有、部分或全部信息,这取决于计算的性质。

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

M×N×……高双数组???...???...? ? ? ... : : : : : :

如果已知类型和相对大小,则显示为:

1×N高字符数组???...

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

100×3高双矩阵0.8147 0.1622 0.6443 0.9058 0.7943 0.3786 0.1270 0.3112 0.8116 0.9134 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::::::

评估与收集

收集函数用于计算高数组。收集接受高数组作为输入,并返回内存中的数组作为输出。因此,您可以将此函数视为高数组和内存中数组之间的桥梁。例如,你不能控制如果循环语句使用一个高大的逻辑数组,但数组一旦被计算收集它变成了您可以在这些上下文中使用的内存中的逻辑值。

收集对高数组执行所有排队操作并返回整个结果在内存中。自收集返回结果作为内存中的MATLAB数组,适用标准内存考虑。如果返回的结果是收集太大。

大部分时间你都可以使用收集查看计算的全部结果,特别是当计算包含诸如总和的意思是.但是,如果结果太大而无法放入内存,则可以使用收集(头(X))收集(尾(X))执行计算并只查看结果的前几行或后几行。

解决错误与收集

如果你输入了错误的命令收集未能计算高数组变量,则必须从工作区中删除该变量并使用该变量重新创建高数组只有有效的命令。这是因为MATLAB会在输入时跟踪您在未求值的高数组上执行的所有操作。让MATLAB“忘记”错误语句的唯一方法是从头开始重建高数组。

示例:计算高数组的大小

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

为数据集创建数据存储airlinesmall.csv.将数据存储转换为一个高表,然后计算其大小。

varnames = {“ArrDelay”“DepDelay”“起源”“桌子”};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 =大小(tt)
S = 1×2高双行向量??预览延期。学习更多的知识。

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

使用收集函数来充分计算tall数组并将结果放入内存。当命令执行时,在命令窗口中会显示一个动态的进度,这对长时间计算特别有帮助。

请注意

一定要确保返回的结果是收集就能装进内存了。如果你使用收集直接在一个高数组上,而不使用诸如的意思是,则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”“起源”“桌子”};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来创建一个新变量AdjArrDelay.然后计算的平均值AdjArrDelay然后减去这个平均值AdjArrDelay.如果这些计算都是单独评估的,那么MATLAB将需要对数据进行四次遍历。

AdjArrDelay = tt。ArrDelay- mean(tt.DepDelay,“omitnan”);AdjArrDelay = AdjArrDelay - mean(AdjArrDelay,“omitnan”
AdjArrDelay = M×1高双列向量???::预览延迟。学习更多的知识。

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

收集(头(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. 如果你输入错误的高数组命令收集未能计算高数组变量,则必须从工作区中删除该变量并使用该变量重新创建高数组只有有效的命令。

另请参阅

|

相关的话题