Main Content

coder.isColumnMajor

現在の関数または変数が列優先のレイアウトを使用するかどうかを判別

説明

現在の関数が列優先の配列レイアウトを使用する場合、coder.isColumnMajor は生成されたコードで true として解決します。関数を制御フロー (ifelseswitch) ステートメントの式として使用します。

coder.isColumnMajor(arg) は、現在の変数が列優先の配列レイアウトを使用している場合 true として解決します。

すべて折りたたむ

コンパイル時に関数の配列レイアウトをクエリするには、coder.isColumnMajor または coder.isRowMajor を使用します。このクエリは、行優先の関数と列優先の関数が関与するとき、生成されたコードを特殊化するのに役立つ場合があります。たとえば、以下の関数を考えます。

function S = addMatrixRouted(A,B)
 if coder.isRowMajor
     %execute this code if row major
     S = addMatrix_OptimizedForRowMajor(A,B); 
 elseif coder.isColumnMajor
     %execute this code if column major
     S = addMatrix_OptimizedForColumnMajor(A,B);
 end

関数 addMatrixRouted は、行優先のレイアウトまたは列優先のレイアウトのどちらを使用するかによって動作が異なります。関数が使用するレイアウトは、たとえば、coder.rowMajor または coder.columnMajor のどちらを含む関数から呼び出されるかによって決まります。addMatrixRouted は、行優先のレイアウトを使用する場合、関数 addMatrix_OptimizedForRowMajor を呼び出します。この関数は行優先のデータに対して効率的なメモリ アクセスを行います。この関数は、列優先のレイアウトを使用する場合、列優先のデータに対して最適化されたバージョンの関数 addMatrix を呼び出します。

クエリ関数を使用すると、addMatrixRouted で生成されたコードはどちらの配列レイアウトを選択しても効率的なメモリ アクセスを提供します。

関数 bar について考えます。

function bar
coder.columnMajor;
x = magic(3);
if coder.isColumnMajor(x)
    fprintf('This will always be displayed in generated code.\n');
else
    fprintf('This will never be displayed in generated code.\n');
end
end

コードを生成します。

codegen bar

MEX 関数を実行するには、以下を入力します。

bar_mex

入力引数

すべて折りたたむ

配列レイアウトをクエリする変数

例: coder.isColumnMajor(x);

制限

  • 構造体フィールドまたはプロパティの配列レイアウトをクエリできません。

ヒント

  • 既定では、コード ジェネレーターは列優先のレイアウトを使用します。

  • コード生成およびシミュレーションの範囲外では、coder.isColumnMajor は常に true になります。

  • コードで coder.isColumnMajor が常に true に解決する場合、if ステートメント内の他のブランチはコード ジェネレーターで無視されます。それ以外の場合、配列レイアウトごとに現在の関数のインスタンスが 1 つ作成されます。

拡張機能

C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。

GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。

バージョン履歴

R2018a で導入