Одно из различий между массивами tall и массивами MATLAB ® в памяти заключается в том, что массивы tall обычно остаются невысокими до тех пор, пока не будет запрошено выполнение вычислений. (Исключения из этого правила включают функции печати, такие какplot и histogram и некоторые статистические аппроксимирующие функции, такие как fitlm, которые автоматически вычисляют входные данные массива высокого уровня.) В то время как массив высокого уровня находится в нерасчетном состоянии, MATLAB может не знать его размер, тип данных или конкретные значения, которые он содержит. Однако в расчетах можно использовать невысокие массивы, как если бы значения были известны. Это позволяет быстро работать с большими наборами данных вместо ожидания выполнения каждой команды. По этой причине рекомендуется использовать gather только при необходимости вывода.
MATLAB отслеживает все операции, выполняемые с неоцениваемыми массивами tall при их вводе. Когда вы в конечном итоге звоните gather Для оценки операций в очереди MATLAB использует историю неоцениваемых команд для оптимизации вычислений путем минимизации количества проходов через данные. Эта оптимизация позволяет экономить огромное количество времени выполнения, устраняя ненужные проходы через большие наборы данных.
Отображение нерасчетных массивов tall зависит от того, насколько 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 используется для вычисления массивов tall. gather принимает массивы tall в качестве входов и возвращает массивы в памяти в качестве выходов. По этой причине эту функцию можно рассматривать как мостик между массивами уровня и массивами в памяти. Например, нельзя управлять if или while операторы цикла, использующие высокий логический массив, но после того, как массив будет вычислен с помощью gather он становится логическим значением в памяти, которое можно использовать в этих контекстах.
gather выполняет все операции в очереди для массива высокого уровня и возвращает весь результат в памяти. С тех пор gather возвращает результаты в виде массивов MATLAB в памяти, применяются стандартные требования к памяти. У MATLAB может закончиться память, если результат будет возвращен gather слишком большой.
Большую часть времени вы можете использовать gather для просмотра всего результата расчета, особенно если расчет включает операцию сокращения, такую как sum или mean. Однако если результат слишком велик для размещения в памяти, то можно использовать gather(head(X)) или gather(tail(X)) для выполнения вычисления и просмотра только первых или последних нескольких строк результата.
gatherПри вводе ошибочной команды и gather не удалось вычислить переменную массива высокого уровня, после чего необходимо удалить переменную из рабочей области и повторно создать массив массива высокого уровня с помощью только допустимых команд. Это происходит потому, что MATLAB отслеживает все операции, выполняемые с нерасчетными массивами tall при их вводе. Единственный способ заставить MATLAB «забыть» об ошибочном утверждении - реконструировать высокий массив с нуля.
В этом примере показано, как выглядит невысокий массив и как его вычислить.
Создание хранилища данных для набора данных airlinesmall.csv. Преобразуйте хранилище данных в высокую таблицу, а затем рассчитайте размер.
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В этом примере показано, как можно объединить несколько вычислений для минимизации общего количества проходов через данные.
Создание хранилища данных для набора данных airlinesmall.csv. Преобразование хранилища данных в таблицу высокого уровня.
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Массивы Tall остаются невысокими до тех пор, пока вы не запросите вывод с помощью gather.
Использовать gather в большинстве случаев для вычисления массива высокого уровня. Если вы считаете, что результат вычислений может не поместиться в памяти, то используйте gather(head(X)) или gather(tail(X)) вместо этого.
Работа в основном с неоцениваемыми массивами tall и запрос выходных данных только при необходимости. Чем больше вычислений в очереди не оценивается, тем больше оптимизации MATLAB может сделать для минимизации количества проходов через данные.
При вводе ошибочной команды массива с высоким значением и gather не удалось вычислить переменную массива высокого уровня, после чего необходимо удалить переменную из рабочей области и повторно создать массив массива высокого уровня с помощью только допустимых команд.