Одно из различий между длинными массивами и MATLAB в оперативной памяти® массивы - то, что длинные массивы обычно остаются неоцененными, пока вы не запрашиваете это, вычисления выполняются. (Исключения к этому правилу включают функции построения графика как plot
и histogram
и некоторые статистические подходящие функции как fitlm
, которые автоматически оценивают входные параметры длинного массива.), В то время как длинный массив находится в неоцененном состоянии, MATLAB не может знать свой размер, свой тип данных или определенные значения, которые это содержит. Однако можно все еще использовать неоцененные массивы в вычислениях, как будто значения были известны. Это позволяет вам работать быстро с большими наборами данных вместо того, чтобы ожидать каждой команды, чтобы выполниться. Поэтому рекомендуется, чтобы вы использовали gather
только, когда вы требуете выхода.
MATLAB отслеживает все операции, которые вы выполняете на неоцененных длинных массивах, когда вы вводите их. Когда вы в конечном счете вызываете gather
чтобы оценить операции в очереди, MATLAB использует историю неоцененных команд, чтобы оптимизировать вычисление путем минимизации количества проходов через данные. При правильном использовании эта оптимизация может сэкономить огромное количество времени выполнения, исключив ненужные проходы через большие наборы данных.
Отображение неоцененных длинных массивов варьируется в зависимости от того, сколько MATLAB знает о массиве и его значениях. Существует три данных, отраженных в отображении:
Размер массивов — размеры Неизвестного измерения представлены переменными M
или N
в отображении. Если никакие размеры размерности не известны, то размер появляется как MxNx....
.
Тип данных массива — Если массив имеет неизвестный базовый тип данных, то его тип появляется как tall array
. Если тип известен, он перечислен как, например, tall double array
.
Значения массивов — Если значения массивов неизвестны, то они появляются как ?
. Известные значения отображены.
MATLAB может знать все, некоторых или ни одни из этих данных о данном длинном массиве, в зависимости от природы вычисления.
Например, если массив имеет известный тип данных, но неизвестный размер и значения, то неоцененный длинный массив может выглядеть так:
M×N×... tall double array ? ? ? ... ? ? ? ... ? ? ? ... : : : : : :
Если тип и относительный размер известны, то отображение могло быть:
1×N tall char array ? ? ? ...
Если некоторые данные известны, то MATLAB отображает известные значения:
100×3 tall double matrix 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 : : : : : :
gather
gather
функция используется, чтобы оценить длинные массивы. gather
принимает длинные массивы как входные параметры и возвращает массивы в оперативной памяти как выходные параметры. Поэтому можно думать об этой функции как о мосте между длинными массивами и массивами в оперативной памяти. Например, вы не можете управлять if
или while
инструкции циклов с помощью высокого логического массива, но однажды массив оценены с gather
это становится логическим значением в оперативной памяти, которое можно использовать в этих контекстах.
gather
выполняет все операции в очереди на длинном массиве и возвращает целый результат в память. С тех пор gather
возвращает результаты как массивы MATLAB в оперативной памяти, стандартные факторы памяти применяются. MATLAB может исчерпать память если результат, возвращенный gather
является слишком большим.
Наиболее часто можно использовать gather
видеть целый результат вычисления, особенно если вычисление включает операцию сокращения такой как sum
или mean
. Однако, если результат является слишком большим, чтобы уместиться в памяти, то можно использовать gather(head(X))
или gather(tail(X))
выполнять вычисление и взгляд на только первое или последние несколько строк результата.
gather
Если вы вводите ошибочную команду и gather
сбои, чтобы оценить переменную длинного массива, затем необходимо удалить переменную из рабочей области и воссоздать длинный массив с помощью только допустимые команды. Это вызвано тем, что MATLAB отслеживает все операции, которые вы выполняете на неоцененных длинных массивах, когда вы вводите их. Единственный способ заставить MATLAB “забыть” об ошибочном операторе состоит в том, чтобы восстановить длинный массив с нуля.
Этот пример показывает то, на что неоцененный длинный массив похож, и как оценить массив.
Создайте datastore для набора данных airlinesmall.csv
. Преобразуйте datastore в длинную таблицу и затем вычислите размер.
varnames = {'ArrDelay', 'DepDelay', 'Origin', 'Dest'}; ds = tabularTextDatastore('airlinesmall.csv', 'TreatAsMissing', 'NA', ... 'SelectedVariableNames', varnames); tt = tall(ds)
tt = M×4 tall table ArrDelay DepDelay Origin Dest ________ ________ ______ _____ 8 12 'LAX' 'SJC' 8 1 'SJC' 'BUR' 21 20 'SAN' 'SMF' 13 12 'BUR' 'SJC' 4 -1 'SMF' 'LAX' 59 63 'LAX' 'SJC' 3 -2 'SAN' 'SFO' 11 -1 'SEA' 'LAX' : : : : : : : :
s = size(tt)
s = 1×2 tall double row vector ? ? Preview deferred. Learn more.
Вычисление размера длинного массива дает маленький ответ (вектор 1 на 2), но отображение указывает, что целый проход через данные все еще требуется, чтобы вычислять размер tt
.
Используйте gather
функционируйте, чтобы полностью оценить длинный массив и загрузить результаты в память. Когда команда выполняется, существует динамическое отображение прогресса в командном окне, которое особенно полезно с долгими вычислениями.
Примечание
Всегда гарантируйте что результат, возвращенный gather
сможет уместиться в памяти. Если вы используете gather
непосредственно на длинном массиве, не уменьшая его размер с помощью функции, такой как mean
, затем MATLAB может исчерпать память.
tableSize = gather(s)
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.42 sec Evaluation completed in 0.48 sec tableSize = 123523 4
В этом примере показано, как несколько вычислений могут быть объединены, чтобы минимизировать общее количество проходов через данные.
Создайте datastore для набора данных airlinesmall.csv
. Преобразуйте datastore в длинную таблицу.
varnames = {'ArrDelay', 'DepDelay', 'Origin', 'Dest'}; ds = tabularTextDatastore('airlinesmall.csv', 'TreatAsMissing', 'NA', ... 'SelectedVariableNames', varnames); tt = tall(ds)
tt = M×4 tall table ArrDelay DepDelay Origin Dest ________ ________ ______ _____ 8 12 'LAX' 'SJC' 8 1 'SJC' 'BUR' 21 20 'SAN' 'SMF' 13 12 'BUR' 'SJC' 4 -1 'SMF' 'LAX' 59 63 'LAX' 'SJC' 3 -2 'SAN' 'SFO' 11 -1 'SEA' 'LAX' : : : : : : : :
Вычтите среднее значение DepDelay
от ArrDelay
создать новую переменную AdjArrDelay
. Затем вычислите среднее значение AdjArrDelay
и вычтите это среднее значение из AdjArrDelay
. Если бы эти вычисления были все оценены отдельно, то MATLAB потребовал бы четырех проходов через данные.
AdjArrDelay = tt.ArrDelay - mean(tt.DepDelay,'omitnan'); AdjArrDelay = AdjArrDelay - mean(AdjArrDelay,'omitnan')
AdjArrDelay = M×1 tall double column vector ? ? ? : : Preview deferred. Learn more.
Оцените AdjArrDelay
и просмотрите первые несколько строк. Поскольку некоторые вычисления могут быть объединены, только три прохода через данные требуются.
gather(head(AdjArrDelay))
Evaluating tall expression using the Local MATLAB Session: - Pass 1 of 3: Completed in 0.4 sec - Pass 2 of 3: Completed in 0.39 sec - Pass 3 of 3: Completed in 0.23 sec Evaluation completed in 1.2 sec ans = 0.8799 0.8799 13.8799 5.8799 -3.1201 51.8799 -4.1201 3.8799
Длинные массивы остаются неоцененными, пока вы не запрашиваете выходное использование gather
.
Использование gather
в большинстве случаев оценивать вычисления длинного массива. Если вы полагаете, что результат вычислений не может уместиться в памяти, затем использовать gather(head(X))
или gather(tail(X))
вместо этого.
Работайте в основном с недооцененными tall arrays и запрашивайте вывод только при необходимости. Чем больше вычислений в очереди, которые не оценены, тем больше оптимизации MATLAB может сделать, чтобы минимизировать количество проходов через данные.
Если вы вводите ошибочную команду длинного массива и gather
сбои, чтобы оценить переменную длинного массива, затем необходимо удалить переменную из рабочей области и воссоздать длинный массив с помощью только допустимые команды.