exponenta event banner

matlab.tall.blockMovingWindow

Применение функции движущегося окна и сокращения блоков к дополненным блокам данных

Описание

пример

tA = matlab.tall.blockMovingWindow(windowfcn,blockfcn,window,tX) применяется blockfcn для заполнения окон данных и windowfcn к неполным окнам данных у краев. window определяет размер скользящего окна. Результат содержит вертикальную конкатенацию применения blockfcn и windowfcn к этим окнам данных.

пример

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

  • windowfcn и blockfcn должен возвращать то же количество выходов, которое было запрошено у matlab.tall.blockMovingWindow.

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

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

пример

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

Примеры

свернуть все

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

Создание хранилища данных для 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.blockMovingWindow для вычисления среднего скользящего значения данных в первом измерении с размером окна 10. С тех пор windowfcn применяется только к одним окнам данных, можно использовать mean функция для уменьшения окон данных вниз в матрицу с одной строкой. blockfcn применяется ко всем блокам данных, поэтому используйте movmean для вычисления среднего значения каждого полного окна данных в блоках.

windowfcn = @(info,x) mean(x,1,'omitnan');
blockfcn = @(info,x) movmean(x,info.Window,1,'omitnan','EndPoints','discard');
A = matlab.tall.blockMovingWindow(windowfcn, blockfcn, 10, tX)
A =

  MxNx... tall double array

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

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

gather(A(1:10,:))
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 1.1 sec
- Pass 2 of 2: Completed in 4.9 sec
Evaluation completed in 6.6 sec
ans = 10×2

   10.8000    8.8000
   18.8333   17.8333
   16.5714   15.0000
   15.8750   13.0000
   14.4444   11.8889
   13.2000   10.8000
   14.0000   11.1000
   13.5000   11.9000
   15.3000   11.4000
   19.7000   13.4000

Расчет статистики перемещения по переменным таблицы.

Загрузить outages.csv набор данных в виде таблицы высокого уровня. Данные содержат информацию об отключениях электроэнергии.

T = tall(readtable('outages.csv'))
T =

  1,468x6 tall table

       Region           OutageTime        Loss     Customers     RestorationTime            Cause       
    _____________    ________________    ______    __________    ________________    ___________________

    {'SouthWest'}    2002-02-01 12:18    458.98    1.8202e+06    2002-02-07 16:50    {'winter storm'   }
    {'SouthEast'}    2003-01-23 00:49    530.14    2.1204e+05                 NaT    {'winter storm'   }
    {'SouthEast'}    2003-02-07 21:15     289.4    1.4294e+05    2003-02-17 08:14    {'winter storm'   }
    {'West'     }    2004-04-06 05:44    434.81    3.4037e+05    2004-04-06 06:10    {'equipment fault'}
    {'MidWest'  }    2002-03-16 06:18    186.44    2.1275e+05    2002-03-18 23:23    {'severe storm'   }
    {'West'     }    2003-06-18 02:49         0             0    2003-06-18 10:54    {'attack'         }
    {'West'     }    2004-06-20 14:39    231.29           NaN    2004-06-20 19:16    {'equipment fault'}
    {'West'     }    2002-06-06 19:28    311.86           NaN    2002-06-07 00:51    {'equipment fault'}
          :                 :              :           :                :                     :
          :                 :              :           :                :                     :

Использовать matlab.tall.blockMovingWindow для применения функции moving-window к блокам таблицы высокого уровня. Укажите следующие параметры:

  • blkstats в качестве блочной функции для работы с полными блоками данных (включенными в конце примера в качестве локальной функции).

  • Размер окна 50 и шаг 5.

  • EndPoints как 'discard' для игнорирования неполных окон данных. С этим значением windowfcn ввод может быть указан как пустой [] поскольку обрабатываются только полные окна данных.

  • Входная таблица имеет шесть переменных, но два выхода являются векторами двойной точности. Укажите двойные скалярные значения в качестве значения для OutputsLike таким образом, функция позволяет изменять тип и размер данных.

[A, B] = matlab.tall.blockMovingWindow([], @blkstats, 50, T, 'Stride', 5, ...
    'EndPoints', 'discard', 'OutputsLike', {1, 1});

Просмотрите несколько строк в результатах.

[A,B] = gather(head(A),head(B))
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 0.43 sec
- Pass 2 of 2: Completed in 0.52 sec
Evaluation completed in 1.5 sec
A = 8×1

  254.0861
  254.0861
  340.3499
  452.0191
  464.8524
  471.9737
  464.8524
  464.8524

B = 8×1
105 ×

    1.3447
    1.0779
    1.4227
    1.4509
    1.2888
    1.2888
    1.2308
    1.3722

blkstats функция вычисляет скользящее медианное значение Loss и Customers табличные переменные в первом измерении с использованием указанного размера окна. Функция применяет Stride значение для уменьшения размера выходного сигнала, а затем возвращает результаты в виде двух векторов.

function [out1, out2] = blkstats(info, t)
    a = movmedian([t.Loss t.Customers], info.Window, 1, 'omitnan', 'EndPoints', 'discard');
    a = a(1:info.Stride:end, :);
    out1 = a(:,1);
    out2 = a(:,2);
end

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

свернуть все

Функция, применяемая к неполным окнам данных, указанным как дескриптор функции, анонимная функция или []. windowfcn вызывается один раз за неполное окно, когда расчет перемещается по данным в высоком измерении. matlab.tall.blockMovingWindow применяется windowfcn только когда 'EndPoints' имеет значение по умолчанию 'shrink'. Если указано другое значение для 'EndPoints', затем установить windowfcn кому [].

Каждый выход windowfcn должен быть того же типа, что и первый ввод данных tX. Вы можете использовать 'OutputsLike' для возврата выходов различных типов данных.

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

[a, b, c, ...] = windowfcn(info, x, y, ...)
info input - это структура, обеспечиваемая matlab.tall.blockMovingWindow которая включает в себя следующие поля:

  • Stride - Указанный размер шага между окнами (по умолчанию: 1). Задайте это значение с помощью 'Stride' пара имя-значение.

  • Window - Указанный размер окна. Задайте это значение с помощью window входной аргумент.

windowfcn должны удовлетворять этим требованиям:

  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, ...] состоит из всех данных в этом массиве высокого уровня.

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

      Если входные данные являются матрицей, N-D массивом, таблицей или расписанием, применяется windowfcn должно привести к уменьшению входных данных в каждом из столбцов или переменных.

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

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

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

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

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

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

Пример: A = matlab.tall.blockMovingWindow(@windowfcn, @blockfcn, 10, tX)

Пример: A = matlab.tall.blockMovingWindow([], @blockfcn, 10, tX, 'EndPoints', 'discard')

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

Функция, применяемая к блокам данных, заданным как дескриптор функции или анонимная функция. blockfcn применяется к блокам данных, содержащим полные окна данных. Таким образом, blockfcn должен работать векторизированным образом на целых блоках данных и возвращаемых выходных данных, имеющих соответствующий размер для указанного размера окна и шага.

Каждый выход blockfcn должен быть того же типа, что и первый ввод данных tX. Вы можете использовать 'OutputsLike' для возврата выходов различных типов данных.

matlab.tall.blockMovingWindow применяется blockfcn к блокам данных, когда блок содержит только завершенные окна:

  • Для средних блоков, когда 'EndPoints' имеет значение 'shrink' (поведение по умолчанию). В этом случае windowfcn работает на неполных окнах данных на концах.

  • Для всех блоков, когда 'EndPoints' имеет значение 'discard' или значение заполнения.

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

[a, b, c, ...] = blockfcn(info, bX, bY, bZ, ...)
info input - это структура, обеспечиваемая matlab.tall.blockMovingWindow которая включает в себя следующие поля:

  • Stride - Указанный размер шага между окнами (по умолчанию: 1). Задайте это значение с помощью 'Stride' пара имя-значение.

  • Window - Указанный размер окна. Задайте это значение с помощью window входной аргумент.

Блоки данных bX, bY, bZ, ... это matlab.tall.blockMovingWindow обеспечивает blockfcn имеют следующие свойства:

  • Блоки содержат только полноразмерные окна. blockfcn не обязательно определять поведение для неполных окон данных.

  • Первое окно данных начинается с первого элемента блока. Последний элемент последнего окна является последним элементом блока.

blockfcn должны удовлетворять этим требованиям:

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

    • Все входы [bX, bY, bZ, ...] имеют одинаковый размер в первом измерении после любого разрешенного расширения.

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

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

    • Применение blockfcn должен привести к уменьшению входных данных таким образом, чтобы результат имел высоту, равную количеству окон в блоке. Вы можете использовать info.Window и info.Stride для определения количества окон в блоке.

      Если входные данные являются матрицей, N-D массивом, таблицей или расписанием, то применяется blockfcn должно привести к уменьшению входных данных в каждом из столбцов или переменных.

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

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

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

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

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

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

Пример: A = matlab.tall.blockMovingWindow(@windowfcn, @blockfcn, 10, tX)

Пример: A = matlab.tall.blockMovingWindow([], @blockfcn, 10, tX, 'EndPoints', 'discard')

Типы данных: 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.blockMovingWindow(@windowfcn, blockfcn, 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.blockMovingWindow имеют те же типы данных и атрибуты, что и указанные массивы прототипов {PA,PB,...}. Необходимо указать 'OutputsLike' всякий раз, когда тип данных выходного массива отличается от типа данных входного массива. При указании 'OutputsLike', то необходимо указать массив прототипа для каждого вывода.

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

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

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

свернуть все

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

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

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

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

Совет

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

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