スパース行列のコード生成
スパース行列は、多くのゼロ要素をもつ配列の効率的なメモリ内のストレージを提供します。スパース行列により、パフォーマンスが向上し、生成されたコードのメモリ使用量が削減されます。スパース行列の計算時間は、非ゼロ要素に対する演算数のみに合わせてスケーリングします。
スパース行列の作成および操作のための関数は、スパース行列にリストされています。コード生成で関数がサポートされているかどうかを確認するには、関数のリファレンス ページを参照してください。コード生成では、すべての関数で sparse
を使用して作成されたスパース行列入力をサポートしていません。
コード生成ガイドライン
コードの効率性を最大化するためにスパース コンストラクターを使用して行列を初期化します。たとえば、3 行 3 列の単位行列を作成するには、sparse(eye(3,3))
ではなく speye(3,3)
を使用します。
スパース行列へのインデックス付き代入では、非スパース行列へのインデックス付き代入と比較して、オーバーヘッドが発生します。例:
S = speye(10); S(7,7) = 42;
MATLAB® でのように、スパース行列は圧縮されたスパース列形式で格納されます。新しい非ゼロ要素をスパース行列に挿入する場合、すべての後続の非ゼロ要素は 1 列ずつ下方向にシフトしなければなりません。これらの余分な操作によりパフォーマンスが遅くなる可能性があります。スパース行列へのアクセスを参照してください。
コード生成の制限
コード生成は、Simulink® の信号、パラメーター、データ ストア メモリに対するスパース行列をサポートしていません。シミュレーション状態の保存および復元はサポートされていません。
スパース行列を使用するコードを生成するには、動的メモリ割り当てを有効にしなければなりません。数が変化する非ゼロ要素およびその値を格納するために、スパース行列は生成されたコードで可変サイズ配列を使用します。動的メモリ割り当て設定を変更するには、MATLAB Function ブロック内の可変サイズ配列に対するメモリ割り当ての制御を参照してください。スパース行列が動的メモリ割り当てに可変サイズ配列を使用するため、可変サイズ データの制限もスパース行列に適用されます。
スパース データを非スパースのデータに割り当てることはできません。生成されたコードは、スパース行列と非スパース行列では異なるデータ型表現を使用します。スパース データの変換には明示的な変換関数 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(:,2) = [];
参考
関連するトピック
- スパース行列
- 生成された関数インターフェイスでの動的に割り当てられた C++ 配列の使用 (MATLAB Coder)