exponenta event banner

Отложенная оценка массивов Tall

Одно из различий между массивами tall и массивами MATLAB ® в памяти заключается в том, что массивы tall обычно остаются невысокими до тех пор, пока не будет запрошено выполнение вычислений. (Исключения из этого правила включают функции печати, такие какplot и histogram и некоторые статистические аппроксимирующие функции, такие как fitlm, которые автоматически вычисляют входные данные массива высокого уровня.) В то время как массив высокого уровня находится в нерасчетном состоянии, MATLAB может не знать его размер, тип данных или конкретные значения, которые он содержит. Однако в расчетах можно использовать невысокие массивы, как если бы значения были известны. Это позволяет быстро работать с большими наборами данных вместо ожидания выполнения каждой команды. По этой причине рекомендуется использовать gather только при необходимости вывода.

MATLAB отслеживает все операции, выполняемые с неоцениваемыми массивами tall при их вводе. Когда вы в конечном итоге звоните gather Для оценки операций в очереди MATLAB использует историю неоцениваемых команд для оптимизации вычислений путем минимизации количества проходов через данные. Эта оптимизация позволяет экономить огромное количество времени выполнения, устраняя ненужные проходы через большие наборы данных.

Отображение нерасчетных массивов Tal

Отображение нерасчетных массивов 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 «забыть» об ошибочном утверждении - реконструировать высокий массив с нуля.

Пример: Расчет размера массива Tall

В этом примере показано, как выглядит невысокий массив и как его вычислить.

Создание хранилища данных для набора данных 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

Пример: Многопроходные вычисления с массивами Tall

В этом примере показано, как можно объединить несколько вычислений для минимизации общего количества проходов через данные.

Создание хранилища данных для набора данных 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

Резюме поведения и рекомендации

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

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

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

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

См. также

|

Связанные темы