スパース行列のコード生成
スパース行列は、多くのゼロ要素をもつ配列の効率的なメモリ内のストレージを提供します。スパース行列により、パフォーマンスが向上し、生成されたコードのメモリ使用量が削減されます。スパース行列の計算時間は、非ゼロ要素に対する演算数のみに合わせてスケーリングします。
スパース行列の作成および操作のための関数は、スパース行列にリストされています。コード生成で関数がサポートされているかどうかを確認するには、関数のリファレンス ページを参照してください。コード生成では、すべての関数で sparse を使用して作成されたスパース行列入力をサポートしていません。
入力定義
coder.typeof を使用して、関数のスパース行列入力を初期化できます。スパース行列の場合、コード ジェネレーターは可変サイズの次元の上限を追跡しません。すべての可変サイズの次元は制限なしとして扱われます。
assert ステートメントを使用して、スパース入力の型をプログラムで定義することはできません。
コード生成ガイドライン
コードの効率性を最大化するためにスパース コンストラクターを使用して行列を初期化します。たとえば、3 行 3 列の単位行列を作成するには、sparse(eye(3,3)) ではなく speye(3,3) を使用します。
スパース行列へのインデックス付き代入では、完全な行列へのインデックス付き代入と比較して、オーバーヘッドが発生します。以下に例を示します。
S = speye(10); S(7,7) = 42;
MATLAB® でのように、スパース行列は圧縮されたスパース列形式で格納されます。新しい非ゼロ要素をスパース行列に挿入する場合、すべての後続の非ゼロ要素は 1 列ずつ下方向にシフトしなければなりません。これらの余分な操作によりパフォーマンスが遅くなる可能性があります。スパース行列へのアクセスを参照してください。
コード生成の制限
スパース行列を使用するコードを生成するには、動的メモリ割り当てを有効にしなければなりません。数が変化する非ゼロ要素およびその値を格納するために、スパース行列は生成されたコードで可変サイズ配列を使用します。動的メモリ割り当て設定を変更するには、Control Dynamic Memory Allocation in Generated Code (MATLAB Coder)を参照してください。
スパース行列が動的メモリ割り当てに可変サイズ配列を使用するため、可変サイズ データに対する制限もスパース行列に適用されます。Generate Code for Variable-Size Arrays (MATLAB Coder)を参照してください。
スパース データを非スパースのデータに割り当てることはできません。生成されたコードは、スパース行列と完全な行列では異なるデータ型表現を使用します。スパース データの変換には明示的な変換関数
sparseおよびfullを使用します。矛盾するサイズ仕様を使用するスパース行列を定義できません。コード ジェネレーターが対応するデータ型定義を C/C++ で作成する際に、スパース行列のサイズを修正します。たとえば、関数
fooはコード生成でエラーになります。function y = foo(n) %#codegen if n > 0 y = sparse(3,2); else y = sparse(4,3); end
スパース行列への論理インデックス作成は、サポートされていません。たとえば、次の構文はコード生成でエラーになります。
S = magic(3); S(S > 7) = 42;
空の配列を代入してスパース行列の要素を削除することはできません。たとえば、
Sがスパース行列である場合、次の構文はコード生成でエラーになります。S(:,2) = [];
スパース行列を定数にすることはできません。
参考
sparse | full | coder.typeof | magic | speye
トピック
- スパース行列
- Generate Code for Variable-Size Arrays (MATLAB Coder)
- 生成される関数インターフェイスでの動的に割り当てられる C 配列の使用 (MATLAB Coder)
- 生成された関数インターフェイスでの動的に割り当てられた C++ 配列の使用 (MATLAB Coder)