Main Content

matlab.tall.movingWindow

移動ウィンドウ関数をデータ ブロックに適用

説明

tA = matlab.tall.movingWindow(fcn,window,tX) は、ウィンドウが tX の最初の次元に沿って移動する間、ウィンドウごとに 1 度、関数 fcn を適用します。出力 tA は、fcn を各ウィンドウに適用した結果の垂直方向の連結です。

[tA,tB,...] = matlab.tall.movingWindow(fcn,window,tX,tY,...)。ここで fcn は、複数の出力を返し、それぞれが fcn の出力引数のいずれかに対応する配列 tA,tB,... を返す関数ハンドルです。fcn への入力は、引数 tX, tY, ... のデータ ウィンドウです。この構文には以下の要件があります。

  • fcnmatlab.tall.movingWindow から要求された出力と同じ数の出力を返さなければならない。

  • fcn の各出力は最初のデータ入力 tX と同じ型でなければならない。

  • すべての出力 tA,tB,... は同じ高さでなければならない。

[___] = matlab.tall.movingWindow(___,Name,Value) は、前述の任意の構文を使用して、1 つ以上の名前と値のペアの引数による追加オプションを指定します。たとえば、ウィンドウ間のステップ サイズを調整するには、'Stride' およびスカラーを指定できます。あるいは、ウィンドウの要素数が足りない場合の端点の処理を変更するには、'EndPoints' および有効なオプション ('shrink''discard'、または数値のパディング値) を指定できます。

すべて折りたたむ

matlab.tall.movingWindow を使用して、航空機の到着遅延および出発遅延の移動中央値を計算します。

airlinesmall.csv データ セットのデータストアを作成し、それを tall 配列に変換します。このデータには米国のフライトの到着時刻と出発時刻に関する情報が含まれています。フライト遅延のベクトルである、変数 ArrDelay および DepDelay を抽出し、各遅延が個々の列に含まれる tall 配列を作成します。

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 を使用して、最初の次元のデータの移動中央値を計算します。ウィンドウ サイズ 5,000 を使用します。

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 1.7 sec
- Pass 2 of 2: Completed in 51 sec
Evaluation completed in 53 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 を使用して、複数の出力をもつ関数をデータ ウィンドウに適用します。

インメモリ ランダム行列から tall 配列を作成します。

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
      :         :         :         :         :
      :         :         :         :         :

最初の次元の各データ ウィンドウの合計値、平均値、中央値、および最頻値を求める関数を作成します。各出力は、最初の次元のサイズが同じでなければなりませんが、他の次元のサイズは異なっていてもかまいません。各データ ウィンドウについて、合計の計算ではスカラーが生成され、他の計算では 1N 列のベクトルが生成されます。

関数をローカル ワークスペースに保存します。

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 を使用して、ウィンドウ サイズが 250 のデータに対して関数 mystats を適用します。mystats からのすべての出力が返されるよう、4 つの出力引数を指定します。'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, ...] は、メモリに収まるデータのブロックです。ブロックは、tall 配列の入力 [tX, tY, tZ, ...] それぞれからデータを抽出することによって生成されます。入力 [x, y, z, ...] は次の特性を満たします。

    • すべての入力 [x, y, z, ...] は最初の次元が同じサイズとなる。

    • [x, y, z, ...] のデータ ブロックは、tall 配列の tall 次元が 1 ではないと仮定した場合、tall 次元の同じインデックスから得られる。たとえば、tXtY の tall 次元が 1 ではない場合、ブロックの最初のセットは x = tX(1:20000,:) および y = tY(1:20000,:) になる可能性があります。

    • [tX, tY, tZ, ...] のいずれかの最初の次元がサイズ 1 である場合、対応するブロック [x, y, z, ...] は、その tall 配列内のすべてのデータで構成される。

    • fcn を適用した結果、入力データはスカラーまたは高さ 1 の配列のスライスに削減されなければならない。

      入力が行列、N 次元配列、table、または timetable である場合、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)]:入力の連結に関数を適用することは、入力に関数を個別に適用してから結果を連結する場合と同じでなければならない。

たとえば、この関数はウィンドウ内の要素の平均および標準偏差を計算し、2 つの出力配列を返します。

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) は、3 要素の各ウィンドウの平均値を計算するために、関数ハンドル @mean を指定します。

データ型: function_handle

ウィンドウ サイズ。正の整数スカラーまたは 2 要素の行ベクトル [NB NF] として指定します。

  • window がスカラーの場合、次のようになります。

    • ウィンドウ サイズが奇数である場合、各ウィンドウはデータ内の対応する要素を中心にして配置されます。

      Illustration of a window size of three for a vector with six elements. There are six windows and the first and last windows have two elements such that each window is centered on the corresponding element in the data.

    • ウィンドウ サイズが偶数である場合、各ウィンドウは現在の要素および直前の要素を中心にして配置されます。

      Illustration of a window size of four for a vector with six elements. The first window has two elements, the second has three elements, the next three windows have four elements, and the last window has three elements. Each window is centered about the current and previous elements.

  • window がベクトル [NB NF] である場合、ウィンドウには入力の直前の NB の要素、現在の要素、および次の NF の要素が含まれます。

    Illustration of a window size of [2 2] for a vector with six elements. The first window has three elements, the second has four elements, the next two windows have five elements, the second-to-last window has four elements, and the last window has three elements. Each window includes two previous values (when possible), the current value, and the next two values (when possible).

既定では、ウィンドウを埋めるのに十分な数の要素がない場合、ウィンドウ サイズは自動的に端点で打ち切られます。ウィンドウがこのように打ち切られる場合、関数はウィンドウを埋めている要素に対してのみ演算を実行します。EndPoints の名前と値のペアを使用してこの動作を変更できます。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

入力配列。スカラー、ベクトル、行列、多次元配列、table、または timetable の個別の引数として指定します。入力配列は、tall 配列またはインメモリ配列にできます。入力配列は変換関数 fcn の入力として使用されます。各入力配列 tX,tY,... は同じ高さでなければなりません。

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。ここで Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後になければなりませんが、ペアの順序は重要ではありません。

R2021a より前では、コンマを使用してそれぞれの名前と値を区切り、Name を引用符で囲みます。

例: tA = matlab.tall.movingWindow(@myFcn, window, tX, 'Stride', 2)

ウィンドウ間のステップ サイズ。'Stride' と正の整数スカラーで構成されるコンマ区切りのペアとして指定します。データ ウィンドウに対して fcn の演算を実行した後、次のウィンドウの演算を実行する前に、'Stride' 値の分だけ計算が進められます。'Stride' の値を既定値の 1 から増やすと、要素を 1 つおき、3 つおき、などのように取り出して出力サイズを削減することと同じになります。

既定では、'Stride' の値は 1 であるため、各ウィンドウは入力の各要素を中心にして配置されます。たとえば、ベクトル [1 2 3 4 5 6]' に対して実行したウィンドウ サイズが 3 の移動合計の計算を次に示します。

Illustration of a moving sum on a vector with six elements utilizing a stride value of 1. A total of six windows are used in the calculation, so the output has six elements.

'Stride' の値が 2 の場合、計算が変わり、各ウィンドウは、入力の 2 つ目ごとの要素 (1、3、5) を中心として配置されます。この場合、移動合計は 6 個ではなく 3 個の部分和を返します。

Illustration of a moving sum on a vector with six elements utilizing a stride value of 2. A total of three windows are used in the calculation, so the output has three elements.

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

先頭および末尾のウィンドウを処理する方法。'EndPoints' と次の表のいずれかの値で構成されるコンマ区切りのペアとして指定します。

ウィンドウ計算の開始時および終了時において、演算される要素のウィンドウは不完全となります。'EndPoints' オプションは、これらの不完全なウィンドウの処理方法を指定します。

'EndPoints'説明例: 移動合計値

'shrink'

入力の端点付近のウィンドウのサイズを縮小し、既存の要素のみを含めます。

Illustration of a moving sum on a vector with six elements. Six windows are used in the moving sum, with the windows at the endpoints including two elements and interior windows including three elements.

'discard'

既存の要素とウィンドウが完全にオーバーラップしない場合、結果を出力しません。

Illustration of a moving sum on a vector with six elements. Four windows are used in the moving sum, with all windows including three elements.

数値または logical のパディング値

存在しない要素を指定した数値または論理値に置き換えます。

  • パディング値は tX と同じ型でなければならない。

  • 最初の次元のパディング値のサイズは 1 と等しく、他の次元のサイズは tX と一致しなければならない。

Illustration of a moving sum on a vector with six elements. Six windows are used in the moving sum, with the windows at the endpoints including two elements plus a fill value. The interior windows have three elements.

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string

出力配列のプロトタイプ。'OutputsLike' およびプロトタイプ配列を含む cell 配列で構成されるコンマ区切りのペアとして指定します。'OutputsLike' を指定する場合、matlab.tall.movingWindow で返される出力配列 tA,tB,... は、指定したプロトタイプ配列 {PA,PB,...} と同じデータ型と属性をもちます。出力配列のデータ型が入力配列のデータ型と異なる場合は常に 'OutputsLike' を指定しなければなりません。'OutputsLike' を指定した場合は、各出力のプロトタイプ配列を指定しなければなりません。

例: tA = matlab.tall.movingWindow(..., tX, 'OutputsLike', {int8(1)}); の場合、tX は倍精度 tall 配列であり、tAdouble ではなく int8 として返します。

データ型: cell

出力引数

すべて折りたたむ

出力配列。スカラー、ベクトル、行列、または多次元配列として返されます。matlab.tall.movingWindow へのいずれかの入力が tall の場合、すべての出力引数も 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 は、tall 配列に対して、より柔軟にスライディング ウィンドウの計算を実行するように設計された高度な API です。したがって、関数は、完全なウィンドウを多数含むデータ ブロックを正確に処理しなければならないため、使用が複雑になります。ただし、適切にベクトル化された計算では、必要な関数呼び出しの数を減らし、パフォーマンスを向上できます。

バージョン履歴

R2019a で導入