matlab-generate-code について
MATLAB CoderでMATLABからC、C++、CUDAを生成するためのワークフロー スキルです。コードの準備から生成、検証、設定調整、MEXのプロファイリングまでを扱います。
主な機能
- 01MATLABコードの生成準備
- 02C、C++、CUDA、MEX、ライブラリの生成
- 03生成結果とMATLABの照合
- 04コード生成設定の調整
- 05生成MEXのプロファイリングと高速化
活用シーン
- 01MATLAB関数のコード生成適合性を確認
- 02MEXまたはスタンドアロンコードを生成
- 03生成結果とMATLABの一致を検証
- 04生成MEXの性能を分析
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-generate-codeインストール後、Claude Code で/matlab-generate-codeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
manifest.yamlreferences/accelerate-mex.mdconfig-properties.mdgenerate-code.mdrefine-config.mdverify-code.mdwrite-c-interop.mdwrite-class-limitations.mdwrite-codegen-ready.mdwrite-coder-directives.mdwrite-core-constraints.mdwrite-numerical-style.mdwrite-performance.mdwrite-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、OptimizeReductions | references/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.