メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

quadprog 用のコード生成の背景

コード生成とは

コード生成とは、MATLAB® Coder™ を使用した、MATLAB コードから C/C++ コードへの変換です。コード生成には、MATLABCoder ライセンスが必要です。

コード生成は通常、MATLAB を実行していないハードウェアにコードを展開するために使用します。

例については、quadprog のコード生成を参照してください。他の最適化ソルバーでのコード生成については、fmincon のコード生成fsolve のコード生成、またはlsqcurvefit または lsqnonlin の用のコード生成を参照してください。

コード生成の要件

  • quadprog は、関数 codegen (MATLAB Coder) または MATLAB Coder アプリを使用したコード生成をサポートしています。コードを生成するには MATLAB Coder ライセンスが必要です。

  • ターゲット ハードウェアは、標準的な倍精度浮動小数点計算または標準的な単精度浮動小数点計算をサポートしていなければなりません。

  • コード生成ターゲットは、MATLAB ソルバーと同じ数学カーネル ライブラリを使用しません。そのため、コード生成解法は、特に、条件付けが不十分な問題の場合に、ソルバー解法と異なる可能性があります。

  • コードを生成する前に MATLAB でコードをテストするには、UseCodegenSolver オプションを true に設定します。これにより、ソルバーがコード生成で作成されるものと同じコードを使用するようになります。

  • コード生成の場合、quadprogproblem 引数をサポートしていません。

    [x,fval] = quadprog(problem) % Not supported
  • quadprog の入力行列 (AAeqlbub など) はすべて完全 (非スパース) でなければなりません。関数 full を使用することで、スパース行列を完全な行列に変換できます。

  • lb 引数と ub 引数は、H の列数と同じ数のエントリをもつか、空 [] でなければなりません。

  • ターゲット ハードウェアが無限境界をサポートしていない場合は、optim.coder.infbound を使用します。

  • 組み込みプロセッサを使用する高度なコード最適化には、Embedded Coder® ライセンスも必要です。

  • quadprog のオプションを含め、関数 optimoptions を使用して指定しなければなりません。オプションには Algorithm オプションを含め、'active-set' に設定しなければなりません。

    options = optimoptions("quadprog",Algorithm="active-set");
    [x,fval,exitflag] = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options);
  • コード生成では次のオプションをサポートしています。

    • Algorithm'active-set' でなければなりません

    • ConstraintTolerance

    • MaxIterations

    • ObjectiveLimit

    • OptimalityTolerance

    • StepTolerance

    • UseCodegenSolver

  • 生成コードでは、オプションに対して限られたエラー チェックしか行われません。オプションの更新方法として、ドット表記ではなく、optimoptions を使用することを推奨します。

    opts = optimoptions('quadprog','Algorithm','active-set');
    opts = optimoptions(opts,'MaxIterations',1e4); % Recommended
    opts.MaxIterations = 1e4; % Not recommended
  • オプションはファイルから読み込まないでください。そうした場合、コード生成に失敗することがあります。代わりに、コード内でオプションを作成してください。

  • サポートされていないオプションを指定すると、通常はコード生成の際にそのオプションは無視されます。信頼できる結果を得るために、サポートされているオプションのみを指定します。

単精度コード生成

単精度浮動小数点ハードウェア用のコードを生成するには、次のガイドラインに従います。

  • ソルバーの入力は必ずすべて単精度の値にします。これらの入力には、空の値や無限値もすべて含まれます。たとえば、3 次元の問題の範囲が lb = [0,-Inf,0]ub = [1,100,Inf] である場合、パラメーターを次のように設定します。

    lb = [single(0),-optim.coder.infbound("single"),single(0)];
    ub = [single([1,100]),optim.coder.infbound("single")];
  • ソルバーの空の引数は必ずすべて単精度にします。以下に例を示します。

    Aeq = single([]); % Or single.empty
    beq = single([]); % Or single.empty

単精度の quadprog コードの生成例については、単精度の quadprog コードの生成を参照してください。

非マルチスレッドな生成コード

既定では、MATLAB 環境外で使用するために生成されたコードは、非マルチスレッドな線形代数ライブラリを使用します。したがって、このコードの実行速度は、MATLAB 環境のコードよりも著しく低速になる可能性があります。

ターゲット ハードウェアに複数のコアが搭載されている場合、カスタム マルチスレッド LAPACK および BLAS ライブラリを使用することにより、パフォーマンスの向上が期待できます。これらのライブラリを生成コードに組み込む方法の詳細については、生成されたスタンドアロン コードでの LAPACK 呼び出しを使用した線形代数の高速化 (MATLAB Coder)を参照してください。

参考

| (MATLAB Coder) | |

トピック