exponenta event banner

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 для расчета скользящей медианы задержек прибытия и вылета авиакомпании.

Создание хранилища данных для 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около-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, ...] происходит из одного и того же индекса в высоком измерении, предполагая, что высокий массив является несинглтоном в высоком измерении. Например, если tX и tY nonsingleton в высоком измерении, то первый набор блоков может быть 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) задает анонимную функцию для вычисления стандартного отклонения каждого окна, игнорируя NaNs.

Пример: 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

Входные массивы, определяемые как отдельные аргументы скаляров, векторов, матриц, многомерных массивов, таблиц или расписаний. Входными массивами могут быть массивы высокого уровня или в памяти. Входные массивы используются в качестве входных данных для функции преобразования 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' и одно из значений в таблице.

В начале и конце оконного расчета окно обрабатываемых элементов является неполным. '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 высокий, тогда все выходные аргументы также высокие. В противном случае все выходные аргументы являются массивами в памяти.

  • Размер и тип данных выходных массивов зависят от указанной оконной функции 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, предназначенный для обеспечения большей гибкости при выполнении расчетов с использованием скользящих окон в массивах tall. Как таковое, это сложнее использовать, так как функции должны точно обрабатывать блоки данных, которые содержат много полных окон. Однако правильно векторизированные вычисления позволяют сократить необходимое количество вызовов функций и повысить производительность.

Представлен в R2019a