tall 配列の遅延評価
tall 配列とインメモリ MATLAB® 配列の違いの 1 つは、一般的に tall 配列は計算の実行を要求するまで "未評価" のままになることです (この規則の例外には、plot
や histogram
などのプロット関数、および fitlm
などの統計近似関数の一部が含まれ、これらは tall array 入力を自動的に評価します)。tall 配列が未評価の状態の間、MATLAB では、そのサイズ、データ型、または含まれる特定の値を認識できない場合があります。ただし、その場合でも、値がわかっているかのように未評価の配列を計算で使用できます。これにより、各コマンドが実行されるのを待たなくても、大きなデータ セットを迅速に操作できます。このため、出力が必要な場合にのみ gather
を使用することを推奨します。
MATLAB では、未評価の tall 配列に実行するすべての操作が入力時に追跡されます。最終的に、gather
を呼び出してキューに入っている演算を評価すると、MATLAB は未評価のコマンドの履歴を使用して、データを通す回数を最小限に抑えることにより計算を最適化します。この 遅延評価 を適切に使用すれば、大きなデータ セットを通す必要がなくなるため、実行時間を大幅に短縮できます。
未評価の tall 配列の表示
未評価の tall 配列の表示は、MATLAB でその配列と値についてどれくらいの情報があるかによって変わります。次の 3 つの情報が表示に反映されます。
配列のサイズ — 不明な次元のサイズは変数
M
またはN
で表されて表示されます。既知の次元のサイズがない場合、サイズがMxNx....
と表示されます。配列データ型 — 配列の基となるデータ型が不明な場合、その型が
tall array
として表示されます。その型が既知の場合は、たとえばtall double array
のように表示されます。配列の値 — 配列の値が不明な場合、
?
と表示されます。既知の値は表示されます。
計算の性質によっては、MATLAB で、特定の tall 配列についてのこれらの個々の情報がすべてまたは部分的に既知である場合や、まったく不明な場合があります。
たとえば、配列のデータ型はわかっているが、サイズと値が不明な場合、この未評価の tall 配列は次のように表示されます。
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 配列を入力として受け取り、出力としてインメモリ配列を返します。このため、この関数を tall 配列とインメモリ配列の間のブリッジと考えることができます。たとえば、tall logical 配列を使用して if
または while
ループ ステートメントを制御することはできませんが、この配列は gather
で評価するとインメモリ logical 値になるため、これらのコンテキストで使用できます。
gather
は、tall 配列についてキューに入っているすべての演算を実行して、メモリ内に "全体" の結果を返します。gather
は結果をインメモリ MATLAB 配列として返すため、通常のメモリに関する注意点を考慮します。gather
によって返された結果が大きすぎると、MATLAB でメモリ不足が発生する可能性があります。
ほとんどの場合、特に計算に sum
や mean
などのリダクション演算が含まれている場合に、gather
を使用して計算全体の結果を確認できます。ただし、結果が大きすぎてメモリに収まらない場合、gather(head(X))
または gather(tail(X))
を使用して計算を実行し、結果の最初または最後の数行だけを参照することができます。
gather
のエラーの解決
誤ったコマンドを入力したために gather
が tall 配列変数の評価に失敗した場合、その変数をワークスペースから削除し、有効なコマンド "のみ" を使用して tall 配列を再作成しなければなりません。これは、未評価の tall 配列で実行するすべての操作が、入力時に MATLAB によって追跡されるためです。MATLAB で、誤りのあるステートメントについての記録を "消去" する唯一の方法は、tall 配列を最初から再作成することです。
例: tall 配列のサイズの計算
この例では、未評価の tall 配列の表示と、その配列の評価方法を説明します。
データ セット airlinesmall.csv
のデータストアを作成します。データストアを tall table に変換し、サイズを計算します。
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.
tall 配列のサイズの計算によって返される答え (1 行 2 列のベクトル) は小さいですが、表示には tt
のサイズを計算するためにはデータ全体を通す必要があることが示されます。
関数 gather
を使用して、tall 配列を完全に評価し、結果をメモリに格納します。コマンドを実行するにつれて、コマンド ウィンドウに動的な進行状況が表示されるため、特に長い計算で役に立ちます。
メモ
gather
によって返される結果がメモリに収まることを常に確認してください。mean
などの関数を使用してサイズを削減せずに直接 gather
を tall 配列に使用すると、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
のデータストアを作成します。データストアを tall table に変換します。
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' : : : : : : : :
ArrDelay
から DepDelay
の平均値を減算して、新しい変数 AdjArrDelay
を作成します。次に AdjArrDelay
の平均値を計算し、この平均値を AdjArrDelay
から減算します。これらの計算をすべて個別に行った場合、MATLAB ではデータを 4 回通す必要があります。
AdjArrDelay = tt.ArrDelay - mean(tt.DepDelay,'omitnan'); AdjArrDelay = AdjArrDelay - mean(AdjArrDelay,'omitnan')
AdjArrDelay = M×1 tall double column vector ? ? ? : : Preview deferred. Learn more.
AdjArrDelay
を評価し、最初の数行を表示します。いくつかの計算を結合できるため、データを通す必要があるのは 3 回のみです。
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
動作と推奨事項の概要
tall 配列は、
gather
を使用して出力を要求するまで評価されません。つまり、遅延評価 と呼ばれる最適化です。tall 配列の計算を評価するには、ほとんどの場合
gather
を使用します。計算の結果がメモリに収まらない可能性がある場合は、代わりにgather(head(X))
またはgather(tail(X))
を使用します。主に未評価の tall 配列を操作し、必要な場合にだけ出力を要求します。キューに入っている未評価の計算が多いほど、MATLAB でより高い最適化を行って、データを通す回数を最小限に抑えることができます。
誤った tall 配列コマンドを入力したために
gather
が tall 配列変数の評価に失敗した場合、その変数をワークスペースから削除し、有効なコマンド "のみ" を使用して tall 配列を再作成しなければなりません。