mcpField
M
matlab-generate-code

matlab-generate-code

github.com/matlab開発1.2k41 回インストール1 日前に更新
リポジトリ

matlab-generate-code について

MATLAB CoderでMATLABからC、C++、CUDAを生成するためのワークフロー スキルです。コードの準備から生成、検証、設定調整、MEXのプロファイリングまでを扱います。

主な機能

  1. 01MATLABコードの生成準備
  2. 02C、C++、CUDA、MEX、ライブラリの生成
  3. 03生成結果とMATLABの照合
  4. 04コード生成設定の調整
  5. 05生成MEXのプロファイリングと高速化

活用シーン

  1. 01MATLAB関数のコード生成適合性を確認
  2. 02MEXまたはスタンドアロンコードを生成
  3. 03生成結果とMATLABの一致を検証
  4. 04生成MEXの性能を分析

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-generate-code

インストール後、Claude Code で/matlab-generate-codeを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

manifest.yaml
references/
accelerate-mex.md
config-properties.md
generate-code.md
refine-config.md
verify-code.md
write-c-interop.md
write-class-limitations.md
write-codegen-ready.md
write-coder-directives.md
write-core-constraints.md
write-numerical-style.md
write-performance.md
write-temporal-types.md

詳細

MATLAB Coder でコードを生成する

MATLAB Coder のワークフローを包括的に扱うスキルです。コードを生成して検証し、設定を調整し、プロファイリング済みの MEX で高速化します。

使用する場面

  • MATLAB 関数から C/C++ または CUDA コード(MEX、lib、dll、exe)を生成するとき
  • コード生成に対応する必要がある新しい MATLAB コードを作成するとき
  • 既存の MATLAB コードがコード生成に対応しているか確認するとき、またはコード生成エラーを修正するとき
  • 特定のターゲット(組み込み、速度、可読性、安全性)向けにコード生成の設定を行うとき
  • 生成されたコードが MATLAB の出力と一致することを検証するとき(coder.runTest、matlabtest.coder.TestCase)
  • 生成された MEX 関数のプロファイリングと高速化を行うとき
  • coder.* ディレクティブ(coder.varsize、coder.const、coder.extrinsic、coder.ceval など)を使用するとき

使用しない場面

  • Simulink Coder/Embedded Coder の Simulink モデルのワークフロー
  • C、C++、CUDA 以外のターゲット言語向けにコードを生成するとき
  • Fixed-Point Designer の変換ワークフロー
  • 手書きの MEX C ファイル(MATLAB Coder で生成していないもの)
  • コード生成とは関係のない一般的な MATLAB プログラミング
より具体的なスキルへの案内
  • AI モデルからコードを生成する場合(loadPyTorchExportedProgram/loadLiteRTModel を介した PyTorch .pt2/LiteRT .tflite)→ matlab-deploy-ai-model を使用してください。基盤となる coder.* ディレクティブ、設定の調整、スクリーナー/検証については、このスキルに戻ってください。
  • 物理的な組み込みハードウェアにデプロイする場合(ターゲット上の PIL、ERT ハードウェア設定、ボードの選択 — STM32/Raspberry Pi/ARM Cortex)→ matlab-deploy-embedded-code を使用してください。このスキルでは、ハードウェアをターゲットとする段階までのホスト側コード生成、SIL、設定の調整を扱います。
  • インタープリター実行される MATLAB を M コードの書き換えで高速化する場合(ベクトル化、事前割り当て、キャッシュ)→ matlab-optimize-performance を使用してください。このスキルの高速化手順は、アルゴリズムの再構成ではなく、MEX/C へのコンパイルを前提としています。
  • 一般的な MATLAB テストを作成する場合(パラメーター化テスト、フィクスチャ、モック、App Designer)→ matlab-write-tests を使用してください。テストスイートの実行、カバレッジの収集、CI/CD については matlab-run-tests を使用してください。このスキルでは、コード生成との同等性を検証するテスト(coder.runTest、matlabtest.coder.TestCase)のみを扱います。
  • コード生成が目的ではなく、非推奨 API を現行の状態に合わせて保守性を高める場合→ matlab-modernize-code を使用してください。このスキルでは、明示的な許可を得たうえで、コード生成の制約を満たすためだけにソースを書き換えます。

ルーティング — 必要に応じて対応するリファレンスファイルを読み込む

ユーザーの意図に合ったワークフローを選び、対応する references/*.md を読み込んでください。各リファレンスファイルは、単独で完結する詳細なガイドです。4つすべてをコンテキストに保持するのではなく、必要なものだけを読み込んでください。

ユーザーの意図読み込むファイル
新しいコード生成対応 MATLAB コードを作成する、コード生成の準備状況について MATLAB コードをレビューする、コード生成エラーを修正する、%#codegen、言語の制約、型/サイズのルールreferences/write-codegen-ready.md
特定の coder.* ディレクティブ(coder.varsize、coder.const、coder.inline、coder.unroll、coder.extrinsic など)を理解するreferences/write-coder-directives.md
コード生成で MATLAB クラスを使用する、クラスの制限、coder.classSignature、ハンドルクラスと値クラスの制約references/write-class-limitations.md
C/C++/CUDA コード(MEX、lib、dll、exe)を生成する、入力型を指定する、coder.screener の問題を修正するreferences/generate-code.md
生成コードが MATLAB と一致することを検証する、coder.runTest/matlabtest.coder.TestCase テストを作成する、SIL をセットアップするreferences/verify-code.md
デプロイ目標(組み込み/速度/可読性/サイズ/安全性)に合わせて動作中の設定を調整する、SIMD 値(SIMDAcceleration、InstructionSetExtensions)、OpenMP、OptimizeReductionsreferences/refine-config.md
設定プロパティの名前、使用可否、または一見わかりにくい動作を確認するreferences/config-properties.md
生成された MEX をプロファイルする、coder.timeit/coder.perfCompare で計測する、ホットスポットを見つけるreferences/accelerate-mex.md

「write」と「generate」と「generate for a class」の区別:

  • 「コード生成対応コードを書く」=コンパイル できるように MATLAB ソースを作成/レビューする(write-codegen-ready.md)
  • 「コードを生成する」=すでに有効な関数から C/C++ を生成するために codegen を実行する(generate-code.md)
  • 「クラスのコードを生成する」/「C++ クラスを生成する」=ユーザーのソースが classdef ファイルである → generate-code.md を読み込む(ステップ 0 では coder.ClassSignature を使ったクラスのエントリーポイントを扱います)。クラスを関数でラップすることを既定の方法にしないでください。
  • 両方に該当する場合(ユーザーが関数を書き、そこからコードを生成したい場合)は、まず write-codegen-ready.md を読み込み、次に generate-code.md を読み込んでください。

複数のワークフローにまたがる依頼(例:「MEX を生成し、検証してから高速化する」)では、すべてを一度に読み込まず、順番にリファレンスを読み込んでください。

対象外

  • Simulink Coder/Embedded Coder のワークフロー(これらは独立したスキルの候補です)。
  • C、C++、CUDA 以外のターゲット言語 — このスキルが対象とするのは C/C++ および CUDA のコード生成のみです。
  • 固定小数点への変換(Fixed-Point Designer を使用してください)。
  • 手書きの MEX ファイル — 高速化のガイダンスは MATLAB Coder で生成された MEX を前提としています。
  • Embedded Coder を使用した CodeExecutionProfiling/SIL プロファイリング — 高速化リファレンスの対象外です。

分野横断のルール

これらはすべてのワークフローに適用されます。ワークフロー別リファレンスをまだ読み込んでいない場合も適用してください。

クラスのエントリーポイント — ラッパー関数ではなく coder.ClassSignature を使用する

ユーザーのターゲットが MATLAB クラス(classdef ファイル)であり、そこから C++ コードを生成したい場合は、クラスの直接コード生成に coder.ClassSignature を使用してください。ラッパーのエントリーポイント関数は作成しないでください。これにより、ユーザーが「C++ クラスを生成する」と言うときに意図している、メソッドを備えた適切な C++ クラスが生成されます。

完全なワークフローについては、references/generate-code.md → ステップ 0 と references/write-class-limitations.md → 「クラスの直接コード生成」を読み込んでください。前提条件の enableCodegenForEntryPointClasses は、セッションごとに 1 回実行する必要があります。

ユーザーの MATLAB バージョンに coder.ClassSignature がない(pre-R2026a)場合、またはクラス構造に互換性がない場合(例:エントリーポイントの入出力にハンドルオブジェクトが含まれる場合)に限り、ラッパー関数を使用してください。

コード生成に対応した関数を作成する前に、入力の型を確認する

新しいコード生成対応関数を作成する前に、必ずユーザーに確認してください。

  • 各入力のデータ型(double、single、int32、uint8、logical、struct など)
  • サイズ/形状(スカラー、固定サイズのベクトル/行列、上限付きの可変サイズなど)
  • 実数か複素数か

ユーザーが DMA オフ(動的メモリなし)のコード生成を明示的に希望していない限り、可変サイズの上限について尋ねないでください。作成方法の詳細は references/write-codegen-ready.md を参照してください。

変数ごとに型とサイズカテゴリは固定する

変数は、最初に代入した後でクラスや複素数属性を変更できません。これは実際にコード生成エラーが発生する最大の原因です。サイズの異なる値を分岐ごとに代入する場合は、事前に coder.varsize を宣言してください。制約の一覧は references/write-codegen-ready.md を参照してください。

毎回、coder.screener の出力を必ず取得する
res = coder.screener('myFunction');   % NOT bare: coder.screener('myFunction')
disp(res.UnsupportedCalls)
disp(res.Messages)

引数だけの coder.screener('func') は、コマンドラインに出力せず GUI を開きます。必ず戻り値を変数に代入してから、UnsupportedCalls と Messages を確認してください。

このルールは、実際に呼び出す場合だけでなく、要約、進捗報告、コメントなど、coder.screener に言及するすべての箇所に適用されます。実行した内容を説明する場合でも、coder.screener('myFunction') を単独で記載せず、代入構文を使うか、「スクリーナー」と文章で表現してください。単独の呼び出しを記載すると、ユーザーにその形式で再現するよう促すことになります。

lib/dll/exe を生成する前に、MEX で検証する

まず MEX を生成し、その出力をインタープリター実行の MATLAB と比較してください。MEX の結果が一致したら、スタンドアロンのターゲットを生成します。インタープリター実行の MATLAB 同士を比較しても何も検証できません。また、lib/dll での強力な最適化によって、デプロイ後のコードパスでのみ発生するバグが隠れることがあります。

許可なくユーザーのソースを変更しない

ユーザーの MATLAB ソースはユーザーのものです。coder.screener が未対応の呼び出しや構文を指摘した場合でも、ソースを黙って書き換えてはいけません。変更を適用する前に、提案する変更(対象の行、削除/置換する内容、その理由)を簡潔に説明し、ユーザーの確認を待ってください。このルールは、try/catch の周囲に一行のガードを追加する場合、containers.Map を struct に置き換える場合、eval を削除する場合、あるいは arguments ブロックをより厳密にする場合にも適用されます。コード生成エラーからソースレベルの修正が提案された場合も同様です。

機械的な軽微な変更にも、同じ確認手順が必要です。例外は、コード生成の実験用にソースをプライベートな作業ディレクトリへコピーする場合のみです。元のファイルに手を加えない限り、コピーは自由に編集できます。

論理値には char ではなく logical を使う

すべての Enable* などの設定プロパティには、true/false を指定してください。'On'/'Off' は使わないでください。不明な場合は class(cfg.PropName) を使って確認してください。

ユーザーから依頼がない限り、レポート用フラグを追加しない

ユーザーがコード生成レポートを明示的に依頼していない限り、-report や -launchreport を渡したり、GenerateReport = true を設定したりしないでください。

変数パスには関数呼び出し構文を使う
% YES — function-call syntax evaluates the variable
outDir = fullfile(pwd, 'codegen_output');
codegen('myFunction', '-config', cfg, '-args', {t1, t2}, '-d', outDir)

% NO — command syntax can take "outDir" as a literal directory name
codegen -config cfg myFunction -args {t1, t2} -d (outDir)
実際の設定オブジェクトを調べる

プロパティ名、既定値、設定タイプごとの対応状況は、MATLAB のリリースによって異なります。設定を提案する前に、ユーザーが実際に使用している設定を確認してください。

cfg = coder.config('lib');     % or 'mex', or coder.gpuConfig(...)
class(cfg)                     % CodeConfig vs. EmbeddedCodeConfig vs. MexCodeConfig
properties(cfg)                % full property list for this version
disp(cfg)                      % current values
isprop(cfg, 'EnableMemcpy')    % does a candidate property exist?

過去のリリースについての記憶ではなく、実際の設定を調べた結果を信頼してください。詳細は references/config-properties.md を参照してください。

クイックリファレンス — Coder ディレクティブ

ディレクティブ目的主な注意点利用可能なバージョン
%#codegenコード生成解析を有効にします関数シグネチャと同じ行か、その後の行に記述する必要がありますR2011a
coder.typeof(val, sz, varDims)コード生成呼び出しの入力型とサイズを定義しますvarDims は論理配列です。true は可変を意味しますR2011a
coder.varsize('x', [bounds])上限付きの可変サイズを宣言します上限を指定しない場合は DMA が必要です。最初の代入より前に宣言してくださいR2011a
coder.const(expr)コンパイル時に式を評価します式には算術演算、関数呼び出し、またはそれらの組み合わせを指定できますR2013b
coder.extrinsic('fn')関数をコンパイル対象から除外しますcoder.const と組み合わせない限り、lib/dll/exe では何もしませんR2011a
coder.inline('always'|'never')関数のインライン化を制御します小規模で頻繁に呼び出されるヘルパーには 'always' を使用しますR2011a
coder.unroll(range)コンパイル時にループを展開します異種の cell / varargin を反復処理する場合に必要ですR2011a
coder.noImplicitExpansionInFunctionブロードキャストのオーバーヘッドを無効にしますオペランドのサイズが常に一致する場合にのみ使用してくださいR2021b
coder.target('MATLAB')MATLAB とコード生成の処理を切り替えます非アクティブな分岐は生成コードから除外されますR2011a
coder.nullcopy(zeros(m,n))ゼロ初期化せずにメモリを割り当てます読み取る前にすべての要素へ値を書き込む場合にのみ安全ですR2011a
coder.ClassSignatureクラスのコード生成への直接的なエントリポイントですセッションごとに一度、enableCodegenForEntryPointClasses が必要ですR2026a

ディレクティブの全ドキュメントについては、references/write-coder-directives.md を読み込んでください。

よくある間違い

間違い正しい方法
戻り値を受け取らずに coder.screener('func') を呼び出すres = coder.screener('func') としてから、res.UnsupportedCalls と res.Messages を確認します
MEX を検証せずに、いきなり lib / dll を生成するまず MEX を生成し、出力を MATLAB と比較してから、最終ターゲットを生成します
EnableRecursion(存在しません)EnableRuntimeRecursion
DynamicMemoryAllocation = 'Off'EnableDynamicMemoryAllocation = false(文字配列ではなく論理値)
memcpy を無効にするために MemcpyThreshold = 0 を指定するEnableMemcpy = false
生成コードを「検証」するために、インタープリター実行の MATLAB を 2 回比較するcoder.runTest(MEX への置き換え)または matlabtest.coder.TestCase を使います。または Embedded Coder で SIL を使用します
coder.timeit(@myFunction, ...)(関数ハンドル)coder.timeit('myFunction', numOutputs, {args}) — 文字列名を使用します
MEX ではなく、インタープリター実行の MATLAB 関数をプロファイリングするmyFunction_mex をプロファイリングします。インタープリター実行の MATLAB はパフォーマンス特性が異なります
assert 文なしで coder.runTest の下でテストスクリプトを実行する必ずアサーションを含めます。含めない場合、coder.runTest は成功時に出力を生成しません
入力型が同じなのに、各テストメソッドで MEX をビルドするTestClassSetup で一度ビルドします。入力型の仕様が異なる場合に限り、テストごとに再ビルドします
matlabtest.coder.TestCase のテストで MATLAB 関数を手動で呼び出すverifyExecutionMatchesMATLAB が内部で MATLAB を呼び出します。execute を実行してから検証するだけです
出力ディレクトリにコマンド構文 -d (outDir) を使う関数呼び出し構文を使います:codegen('func', '-config', cfg, '-args', types, '-d', outDir)
-report、-launchreport、または GenerateReport = true を追加する明示的に要求されない限り、コードレポートを生成しないでください
チェックを有効にして先に実行せず、MEX で IntegrityChecks = false にする想定されるすべての入力について、まずチェックを有効にして実行します。境界エラーがないことを確認してから無効にしてください
EnableDynamicMemoryAllocation = false と EnableVariableSizing = false を同時に指定するEnableVariableSizing = true を維持し、可変サイズ配列を上限サイズでスタックに割り当てます
ループ内で配列を拡張する(x = [x; row])ループの前に配列全体を事前割り当てします
コード生成パスで try / catch を使うステータスコードを返します。MATLAB のみのエラー処理には coder.target('MATLAB') を使います
代入のたびに変数の型が変わるスコープ全体を通して、1 つの変数の型を統一します
関数が経路によって異なる型やサイズを返すすべての経路で出力の型とサイズを統一します
%#codegen プラグマがない関数シグネチャの後に必ず含めます
lib / dll で coder.extrinsic に実行時の動作を期待するextrinsic 呼び出しはポータブルターゲット向けのコードを生成しません。coder.const と組み合わせてください
Tech Preview を有効にせず coder.ClassSignature / -class を使うクラスのコード生成前に、MATLAB セッションごとに一度 enableCodegenForEntryPointClasses を実行します

規約

  • 提案または記述する MATLAB コードには MathWorks Coding Guidelines を適用します。関数には lowerCamelCase を使用し、arguments ブロックを使い、入力は最大 6 個、出力は最大 4 個とし、終端には end を使用します。
  • MEX と MATLAB の浮動小数点比較には、完全一致ではなく許容誤差(AbsTol / RelTol)を使用します。数学ライブラリの違いにより、相対誤差が 1e-10 未満になるのは通常です。
  • 可変サイズ配列では、coder.typeof(example, [maxDims], [variableFlags]) を使って上限を指定します。
  • コンパイル時に値が判明しているエントリポイント入力には coder.Constant を使い、コード生成で後続の配列サイズを静的に解決できるようにします。

Copyright 2026 The MathWorks, Inc.


コメント