Отсроченная оценка длинных массивов

Одно из различий между длинные массивы и 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

Сводные данные поведения и рекомендации

  1. Длинные массивы остаются недооцененными, пока вы не запросите выход с помощью gather.

  2. Использовать gather в большинстве случаев для оценки вычислений длинный массив. Если вы считаете, что результат вычислений может не помещаться в памяти, используйте gather(head(X)) или gather(tail(X)) вместо этого.

  3. Работайте в основном с недооценённые длинные массивы и запрашивайте вывод только при необходимости. Чем больше вычислений в очереди, которые не оценены, тем больше оптимизации MATLAB может сделать, чтобы минимизировать количество проходов через данные.

  4. Если вы вводите ошибочную команду длинный массив и gather не удалось вычислить переменную длинный массив, затем необходимо удалить переменную из рабочей области и воссоздать длинный массив только с помощью допустимых команд.

См. также

|

Похожие темы