matlab.tall.movingWindow

Применить функцию окна для блоков данных

Описание

пример

tA = matlab.tall.movingWindow(fcn,window,tX) применяет функцию fcn один раз за окно, когда окно перемещается по первой размерности tX. Область выхода tA - вертикальная конкатенация результатов применения fcn в каждое окно.

пример

[tA,tB,...] = matlab.tall.movingWindow(fcn,window,tX,tY,...), где fcn - указатель на функцию, который возвращает несколько выходов, возвращает массивы tA,tB,..., каждый из которых соответствует одному из выходных аргументов fcn. Входы для fcn являются ли окна данных из аргументов tX, tY, .... Этот синтаксис имеет следующие требования:

  • fcn необходимо вернуть то же количество выходов, что и запрашивалось у matlab.tall.movingWindow.

  • Каждый выход fcn должен быть того же типа, что и первый вход данных tX.

  • Все выходы tA,tB,... должна иметь одинаковую высоту.

[___] = matlab.tall.movingWindow(___,Name,Value) задает дополнительные опции с одним или несколькими аргументами пары "имя-значение", используя любой из предыдущих синтаксисов. Для примера, чтобы настроить размер шага между окнами, можно задать 'Stride' и скаляром. Или изменить обработку конечных точек, где недостаточно элементов для завершения окна, можно задать 'EndPoints' и действительная опция ('shrink', 'discard', или числовое значение заполнения).

Примеры

свернуть все

Использование matlab.tall.movingWindow для вычисления медианы прибытия и задержки вылета авиакомпании.

Создайте datastore для airlinesmall.csv набор данных и преобразовать его в длинный массив. Данные содержат информацию о времени прибытия и вылета американских рейсов. Извлечение ArrDelay и DepDelay переменные, которые являются векторами задержек рейсов, чтобы создать длинный массив, содержащий задержки как отдельные столбцы.

varnames = {'ArrDelay', 'DepDelay'};
ds = tabularTextDatastore('airlinesmall.csv', 'TreatAsMissing', 'NA', ...
    'SelectedVariableNames', varnames);
tt = tall(ds);
tX = [tt.ArrDelay tt.DepDelay]
tX =

  Mx2 tall double matrix

     8    12
     8     1
    21    20
    13    12
     4    -1
    59    63
     3    -2
    11    -1
    :     :
    :     :

Использование matlab.tall.movingWindow для вычисления движущейся медианы данных в первой размерности. Используйте размер окна 5000.

fcn = @(x) median(x,1,'omitnan');
tA = matlab.tall.movingWindow(fcn,5000,tX)
tA =

  MxNx... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

Соберите уникальные строки результата в память.

tA = gather(unique(tA,'rows'))
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 0.96 sec
- Pass 2 of 2: Completed in 46 sec
Evaluation completed in 47 sec
tA = 31×2

   -4.0000   -2.0000
   -3.5000   -2.0000
   -3.0000   -2.0000
   -3.0000   -1.5000
   -3.0000   -1.0000
   -3.0000   -0.5000
   -3.0000         0
   -2.5000   -1.0000
   -2.5000         0
   -2.0000   -1.0000
      ⋮

Использование matlab.tall.movingWindow применить функцию с несколькими выходами к окнам данных.

Создайте длинный массив из случайной матрицы в памяти.

X = rand(1000,5);
tX = tall(X)
tX =

  1,000x5 tall double matrix

    0.8147    0.6312    0.7449    0.3796    0.4271
    0.9058    0.3551    0.8923    0.3191    0.9554
    0.1270    0.9970    0.2426    0.9861    0.7242
    0.9134    0.2242    0.1296    0.7182    0.5809
    0.6324    0.6525    0.2251    0.4132    0.5403
    0.0975    0.6050    0.3500    0.0986    0.7054
    0.2785    0.3872    0.2871    0.7346    0.0050
    0.5469    0.1422    0.9275    0.6373    0.7825
      :         :         :         :         :
      :         :         :         :         :

Создайте функцию, которая находит сумму, среднее значение, медиану и режим каждого окна данных в первой размерности. Каждый выход должен иметь одинаковый размер в первой размерности, но другие размерности могут иметь различные размеры. Для каждого окна данных вычисление суммы создает скаляр, в то время как другие вычисления производят 1-by- N векторы.

Сохраните функцию в локальной рабочей области.

function [S,mn,mdn,md] = mystats(X)
  S = sum(X,[2 1]);
  mn = mean(X,1);
  mdn = median(X,1);
  md = mode(X,1);
end

Примечание: Эта функция включена в конец примера как локальная функция.

Использование matlab.tall.movingWindow для применения mystats функция для данных с размером окна 250. Задайте четыре выходных аргументов, чтобы вернуть все выходы mystats. Используйте 'EndPoints' Пара "имя-значение", чтобы отменить неполные окна.

[tS,tmn,tmdn,tmd] = matlab.tall.movingWindow(@mystats, 250, tX, 'EndPoints', 'discard')
tS =

  MxNx... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :


tmn =

  MxNx... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :


tmdn =

  MxNx... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :


tmd =

  MxNx... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :
function [S,mn,mdn,md] = mystats(X)
  S = sum(X,[2 1]);
  mn = mean(X,1);
  mdn = median(X,1);
  md = mode(X,1);
end

Входные параметры

свернуть все

Оконная функция для применения, заданная как указатель на функцию или анонимная функция. Каждый выход fcn должен быть того же типа, что и первый вход tX. Можно использовать 'OutputsLike' опция для возврата выходов различных типов данных.

Общая функциональная подпись fcn является

[a, b, c, ...] = fcn(x, y, z, ...)
fcn должны удовлетворять этим требованиям:

  1. Входные параметры - Входы [x, y, z, ...] являются блоками данных, которые помещаются в памяти. Блоки генерируются путем извлечения данных из соответствующих входов длинный массив [tX, tY, tZ, ...]. Входы [x, y, z, ...] удовлетворить этим свойствам:

    • Все входы [x, y, z, ...] иметь тот же размер в первой размерности.

    • Блоки данных в [x, y, z, ...] происходит от того же индекса в tall размерности, принимая, что длинный массив является nonsingleton в tall размерности. Для примера, если tX и tY nonsingleton в tall размерности, тогда первый набор блоков может быть x = tX(1:20000,:) и y = tY(1:20000,:).

    • Когда первая размерность любого из [tX, tY, tZ, ...] имеет размер 1, соответствующий блок [x, y, z, ...] состоит из всех данных в этот длинный массив.

    • Применение fcn должно привести к уменьшению входных данных до скаляра или среза массива высотой 1.

      Когда вход является матрицей, N-D массивом, таблицей или расписанием, применение fcn должно привести к сокращению входных данных в каждом из его столбцов или переменных.

  2. Выходные аргументы - выходы [a, b, c, ...] являются блоками, помещаемыми в памяти, которые передаются на соответствующие выходы [tA, tB, tC, ...]. Выходные выходы [a, b, c, ...] удовлетворить этим свойствам:

    • Все выходы [a, b, c, ...] должен иметь тот же размер в первой размерности.

    • Все выходы [a, b, c, ...] сгруппированы по вертикали с соответствующими результатами предыдущих вызовов в fcn.

    • Все выходы [a, b, c, ...] передаются к тому же индексу в первой размерности в соответствующих выходных массивах назначения.

  3. Функциональные правила - fcn должен удовлетворять функциональному правилу:

    • F([inputs1; inputs2]) == [F(inputs1); F(inputs2)]Применение функции к конкатенации входов должно быть таким же, как применение функции к входам отдельно, а затем конкатенация результатов.

Например, эта функция вычисляет среднее и стандартное отклонение элементов в окне и возвращает два выходных массива:

function [mv,sd] = movstats(tX)
mv = mean(tX,1,'omitnan');
sd = std(tX,1,'omitnan');
end
После сохранения этой функции в доступной папке можно вызвать функцию с размером окна 5 с помощью этой команды:
[tA,tB] = matlab.tall.movingWindow(@movstats,5,tX)

Пример: tA = matlab.tall.movingWindow(@(x) std(x,1,'omitnan'), tX) задает анонимную функцию, чтобы вычислить стандартное отклонение каждого окна, игнорируя NaNс.

Пример: tA = matlab.tall.movingWindow(@mean,3,tX) задает указатель на функцию @mean вычисление среднего значения каждого трехэлементного окна.

Типы данных: function_handle

Размер окна, заданный как положительный целочисленный скаляр или двухэлементный вектор-строка [NB NF].

  • Если window является скаляром, тогда:

    • Когда размер окна нечетный, каждое окно центрируется на соответствующем элементе данных.

    • Когда размер окна ровен, каждое окно центрируется вокруг текущего и предыдущего элементов.

  • Если window является вектором [NB NF], затем окно включает в себя предыдущие NB элементы, текущий элемент и следующая NF элементы входов.

По умолчанию размер окна автоматически обрезается в конечных точках, когда недостаточно элементов для заполнения окна. Когда окно усечено таким образом, функция действует только с элементами, которые заполняют окно. Вы можете изменить это поведение с помощью EndPoints Пара "имя-значение".

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Входные массивы, заданные как отдельные аргументы скаляров, векторов, матриц, многомерных массивов, таблиц или timetables. Входные массивы могут быть tall или in-memory arrays. Входные массивы используются в качестве входов в функции преобразования fcn. Каждый входной массив tX,tY,... должна иметь одинаковую высоту.

Аргументы в виде пар имя-значение

Задайте необязательные разделенные разделенными запятой парами Name,Value аргументы. Name - имя аргумента и Value - соответствующее значение. Name должны находиться внутри кавычек. Можно задать несколько аргументов в виде пар имен и значений в любом порядке Name1,Value1,...,NameN,ValueN.

Пример: tA = matlab.tall.movingWindow(@myFcn, window, tX, 'Stride', 2)

Размер шага между окнами, заданный как разделенная разделенными запятой парами, состоящая из 'Stride' и положительный целочисленный скаляр. После fcn действует в окне данных, вычисление совершенствуется 'Stride' значение перед работой в следующем окне. Увеличение значения 'Stride' значение по умолчанию 1 совпадает с уменьшением размера выхода путем выделения каждого другого элемента или каждого третьего элемента и так далее.

По умолчанию значение 'Stride' является 1, так что каждое окно расположено по центру от каждого элемента во входе. Например, вот вычисление движущейся суммы с размером окна 3, работающим с вектором [1 2 3 4 5 6]':

Если значение 'Stride' является 2затем вычисление изменяется так, чтобы каждое окно было сосредоточено на каждом втором элементе входа (1, 3, 5). Теперь движущаяся сумма возвращает три частичные суммы, а не шесть:

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Метод обработки начальных и конечных окон, заданный как разделенная разделенными запятой парами, состоящая из 'EndPoints' и одно из значений в таблице.

В начале и конце оконного вычисления окно управляемых элементов является неполным. The 'EndPoints' опция задаёт способ обработки этих неполных окон.

'EndPoints' ЗначениеОписаниеПример: Движущаяся Сумма

'shrink'

Уменьшите размер окна рядом с конечными точками входов, чтобы включать только существующие элементы.

'discard'

Не выводите результаты, в которых окно не полностью перекрывается с существующими элементами.

Числовое или логическое значение заполнения

Замените несуществующие элементы заданным числом или логическим значением.

  • Значение заполнения должно иметь тот же тип, что и tX.

  • Размер значения в первой размерности должен быть равен 1, а размер в других размерностях должен совпадать tX.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string

Прототип выхода массивов, заданный как разделенная запятой пара, состоящий из 'OutputsLike' и массив ячеек, содержащий прототипные массивы. Когда вы задаете 'OutputsLike', выходные массивы tA,tB,... возвращено matlab.tall.movingWindow имеют те совпадающие типы данных и атрибуты, что и указанные прототипные массивы {PA,PB,...}. Вы должны задать 'OutputsLike' каждый раз, когда тип данных массива выхода отличается от типа данных массива входов. Если вы задаете 'OutputsLike', затем необходимо задать прототипный массив для каждого выхода.

Пример: tA = matlab.tall.movingWindow(..., tX, 'OutputsLike', {int8(1)});, где tX - это длинный массив двойной точности, возвратов tA как int8 вместо double.

Типы данных: cell

Выходные аргументы

свернуть все

Выходные массивы, возвращенные как скаляры, векторы, матрицы или многомерные массивы. Если какой-либо вход в matlab.tall.movingWindow tall, тогда все выходные аргументы также высокие. В противном случае все выходные аргументы являются массивами в памяти.

  • Размер и тип данных выходных массивов зависят от заданной функции окна fcn.

  • Массивы выхода tA,tB,... все имеют одинаковую высоту, которая зависит от значения 'Stride' и 'EndPoints'. По умолчанию выходные массивы имеют тот же размер, что и входные массивы.

  • В целом выходы tA,tB,... все должны иметь тот совпадающий тип данных, что и первый вход tX. Однако можно задать 'OutputsLike' для возврата различных типов данных. В случаях, когда входные массивы tX, tY, ... пусты, или когда 'EndPoints' является 'discard' и не хватает элементов, чтобы заполнить полноразмерное окно, matlab.tall.movingWindow возвращает пустые выходы. Размеры пустых выходов основаны на размере входного массива tX, или от размеров прототипных массивов, предоставляемых 'OutputsLike', если задан.

Совет

  • Использовать matlab.tall.movingWindow для простых вычислений окна скольжения. matlab.tall.blockMovingWindow - расширенный API, созданный для обеспечения большей гибкости при выполнении вычислений окна скольжения на длинных массивах. Таким образом, его сложнее использовать, поскольку функции должны точно обрабатывать блоки данных, которые содержат много полных окон. Однако при правильно векторизованных вычислениях можно уменьшить необходимое количество вызовов функций и улучшить эффективность.

Введенный в R2019a