Одно из различий между длинные массивы и 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
циклические операторы с использованием tall logical array, но после оценки массива с gather
он становится логическим значением в памяти, которое можно использовать в этих контекстах.
gather
выполняет все операции в очереди на длинный массив и возвращает весь результат в памяти. С тех пор gather
возвращает результаты как в памяти MATLAB arrays, применяются стандартные факторы памяти. 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))
вместо этого.
Работайте в основном с недооценённые длинные массивы и запрашивайте вывод только при необходимости. Чем больше вычислений в очереди, которые не оценены, тем больше оптимизации MATLAB может сделать, чтобы минимизировать количество проходов через данные.
Если вы вводите ошибочную команду длинный массив и gather
не удалось вычислить переменную длинный массив, затем необходимо удалить переменную из рабочей области и воссоздать длинный массив только с помощью допустимых команд.