メインコンテンツ

スパース行列のコード生成

スパース行列は、多くのゼロ要素をもつ配列の効率的なメモリ内のストレージを提供します。スパース行列により、パフォーマンスが向上し、生成されたコードのメモリ使用量が削減されます。スパース行列の計算時間は、非ゼロ要素に対する演算数のみに合わせてスケーリングします。

スパース行列の作成および操作のための関数は、スパース行列にリストされています。コード生成で関数がサポートされているかどうかを確認するには、関数のリファレンス ページを参照してください。コード生成では、すべての関数で 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) = [];

  • スパース行列を定数にすることはできません。

参考

| | | |

トピック