主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

N次元インデックスを使用するコードの生成

既定では、コード ジェネレーターは配列に 1.次元インデックスを使用します。コード ジェネレーターは、MATLAB®コードでのN次元配列に対してC / c++コードで1次元配列を作成します。N次元インデックスを使用して可読性を向上させ,インターフェイスを生成されたコードに適用することができます。

以下の表はN次元インデックスが有効の場合と無効の場合に生成されるコードの違いの例を示しています。

MATLABコード

生成されるCコード(既定)

N次元インデックス有効時に生成されるCコード

一个= 0(2、4、6)
一个[48]
  • 列優先の配列レイアウト (既定) の場合:

    一个[6][4][2]
  • 行優先の配列レイアウトが有効になっている場合:

    一个[2][4][6]

MATLABは、既定で列優先の配列レイアウトを使用するコードを生成するため、N次元インデックスのインデックスの次元は逆になります。インデックスの次元を切り替えるために、行優先の配列レイアウトを有効にできます。

N次元配列の1次元への変換は,配列の“フラット化”とも呼ばれます。コンピューターメモリでは,すべてのデータは1次元の配列に格納されます。インデックスの選択により計算結果が変わることはありません。ただし,コードに配列の入力または出力がある場合,生成されたコードに対するインターフェイスが変更される可能性があります。

N次元インデックスを有効にするには,次の手順に従います。

  • -preservearraydimsオプションを使用します。

    codegen喷火-preservearraydims
  • コード生成構成オブジェクトのPreserveArrayDimensionsプロパティを符合事实的に設定します,次に例を示します。

    cfg = coder.config (“自由”);cfg。PreserveArrayDimensions = true;codegen喷火配置cfg

MATLAB编码器™アプリからN次元インデックスを有効にするには,次の手順に従います。

  • コード生成ワークフローにおいて[コード生成)ページに移動します。

  • [生成]矢印をクリックして[生成]ダイアログボックスを開きます。

  • [詳細設定]をクリックします。

  • [メモリ]タブで,[配列の次元を保持]チェックボックスをオンにします。

N次元インデックスおよび行優先のレイアウトによる可読性の向上

N次元インデックスにより、生成された C/C++コードの MATLABコードへのトレースが容易になります。コード ジェネレーターは、配列を 1.次元に変換せず、元の配列の次元を保持します。さらに、行優先のレイアウトを指定して、コード外観をさらに直感的にすることができます。

2つの行列を1要素ずつ追加する,MATLAB関数addMatricesについて考えます。

作用总和=相加矩阵(A,B)% # codegen和= coder.nullcopy(一个);行= 1:尺寸(1)col=1:大小(A,2)和(行,列)=A(行,列)+B(行,列);结束结束

2.行 4.列の配列を操作するように、addMatricesのコードを生成します。N次元インデックスおよび行優先の配列レイアウトを有効にします。

cfg = coder.config (“自由”);cfg。PreserveArrayDimensions = true;cfg。RowMajor = true;codegenaddMatricesarg游戏{的(2、4)的(2、4)}配置cfg-launchreport

コード生成により,明示的な2次元配列インデックスを使用するコードが生成されます。

void addMatrices(double A[2][4], double B[2][4], double sum[2][4]) {int row;int上校;For (row = 0;行< 2;Row ++) {for (col = 0;坳< 4;坳+ +){总和(行)(col) =(行)(col) + B(行)(col);}}}

addMatricesに対して生成されたコードは、元の MATLABコードと同じ 2.次元インデックスを使用します。生成されたコードを元のアルゴリズムと比較して容易に解析できます。行優先のレイアウトの使用方法を理解するには、行優先の配列レイアウトを使用するコードの生成を参照してください。

列優先のレイアウトおよびN次元インデックス

配列レイアウトの選択は,N次元インデックスの外観に影響します。たとえば,列優先の配列レイアウトを使用して関数addMatricesに対するコードを生成します。

cfg。RowMajor = false;codegenaddMatricesarg游戏{的(2、4)的(2、4)}配置cfg-launchreport

コード生成により,次のCコードが生成されます。

/* addMatrices(double A[4][2], double B[4][2], double sum[4][2]) {int row;int上校;For (row = 0;行< 2;Row ++) {for (col = 0;坳< 4;坳+ +){总和(col)(行)= (col)(行)+ B (col)(行);}}}

Cコードでの入力および出力行列は,元のMATLAB行列の転置です。理由を理解するために,コンピューターメモリで配列を表現する方法について考えます。MATLAB言語は,既定で列優先のレイアウトを使用します。ここでは,最初(左端)の次元またはインデックスの要素はメモリ内で連続しています。Cは,既定で行優先の配列レイアウトを使用します。ここでは,最後(右端)の次元またはインデックスの要素は連続しています。元の要素の隣接性を保持するには,コードジェネレーターは配列次元の順序を逆にしなければなりません。

たとえば,ここでは,MATLAB行列一个を次のように定義すると仮定します。

=重塑(1:8,2、4)

または

A = 1 3 5 7 2 4 6 8

MATLABが列優先のレイアウトを使用するため,この場合,データは内部的に次の順序で格納されます。

A(:)' = 1 2 3 4 5 6 7 8

Cコードでは、元のデータを転置しなければなりませんが、この例ではAAと呼びます。

AA={1,2},{3,4},{5,6},{7,8};

データ要素のリストを取得するために、同じ内部ストレージの順序を使用します。言い換えれば、C配列は 4.行 2.列でなければなりません(Aa = {{1,2,3,4}, {5,6,7,8}}を使用して配列を2行4列として定義することで,同様のストレージの順序を取得できます。ただし,この順序を取得するには,手動でのデータの形状の変更または並べ替えが必要です)。

配列レイアウトの選択は内部データ表現のみに影響し,計算結果やアルゴリズムの結果は変わりません。生成されたコードでMATLAB配列の直感的な外観を維持するには,N次元インデックスを行優先の配列レイアウトと共に使用します。行優先のレイアウトが生成されたコードの効率性に影響する可能性があることに注意してください。詳細については,行優先のレイアウトのコード設計を参照してください。

コード生成のその他の考慮事項

N次元インデックスのその他の側面について考えます。N次元インデックスを指定する場合でも,コードジェネレーターは,N次元ベクトルに対して常に1次元配列を生成します。たとえば,MATLABベクトルに対してコードを生成する場合

= 0 (10)

または

一个= 0 (1,1)

結果の C/C++配列は、次のように格納されます。

一个[10]

N次元インデックスは,配列および構造体にも適用されます。たとえば,コードで構造体を次のように宣言する場合

x =结构(“f1”的(2、3));coder.cstructname (x,“myStruct1”);y=结构(“f2”的(6,1));coder.cstructname (y,“myStruct2”);

すると,生成されたコードには構造体定義が含まれます。

Typedef struct {double f1[2][3];} myStruct1;Typedef struct {double f2[6];} myStruct2;

N次元配列に対する線形インデックスを行わないようにします。たとえば,コロン演算子を使用すると線形インデックスが発生します。

(:)

線形インデックスを適用するには、コード ジェネレーターは N次元配列を 1.次元配列にキャストしなければなりません。キャスティング演算により、コードの解析はコード ジェネレーターにとってさらに複雑になります。複雑であることによって、コード ジェネレーターのパフォーマンスの最適化機能が低下する可能性があります。

最後に,次の点に注意してください。

  • 任意のデータ型の配列にN次元インデックスを使用できます。

  • 可変サイズ配列ではなく,固定サイズ配列のみがN次元インデックスを使用できます。

参考

||

関連するトピック