linprog 用のコード生成の背景
コード生成とは
コード生成とは、MATLAB® Coder™ を使用した、MATLAB コードから C/C++ コードへの変換です。コード生成には、MATLABCoder ライセンスが必要です。
コード生成は通常、MATLAB を実行していないハードウェアにコードを展開するために使用します。
例については、linprog のコード生成を参照してください。他の最適化ソルバーでのコード生成の例については、fmincon のコード生成、fsolve のコード生成、quadprog のコード生成、coneprog のコード生成、またはlsqcurvefit または lsqnonlin の用のコード生成を参照してください。
コード生成の要件
linprogは、関数codegen(MATLAB Coder) または MATLAB Coder アプリを使用したコード生成をサポートしています。コードを生成するには MATLAB Coder ライセンスが必要です。ターゲット ハードウェアは、標準的な倍精度浮動小数点計算をサポートしていなければなりません。
コード生成ターゲットは、MATLAB ソルバーと同じ数学カーネル ライブラリを使用しません。そのため、コード生成解法は、特に、条件付けが不十分な問題の場合に、ソルバー解法と異なる可能性があります。
コード生成の場合、
linprogはproblem引数をサポートしていません。[x,fval] = linprog(problem) % Not supportedlinprogの入力行列 (A、Aeq、lb、ubなど) はすべて完全でもスパースでもかまいません。スパース入力を使用するには、動的メモリ割り当てを有効にする必要があります。コード生成の制限 (MATLAB Coder)を参照してください。非ゼロのエントリの割合が少ない場合、スパース入力を使用するとソルバーは良好なパフォーマンスを示します。lb引数とub引数は、線形目的関数ベクトルfと同じ数のエントリをもつか、空の[]でなければなりません。ターゲット ハードウェアが無限境界をサポートしていない場合は、
optim.coder.infboundを使用します。組み込みプロセッサを使用する高度なコード最適化には、Embedded Coder® ライセンスも必要です。
linprogのオプションを含め、関数optimoptionsを使用して指定しなければなりません。オプションにはAlgorithmオプションを含め、"interior-point"に設定しなければなりません。options = optimoptions("linprog",Algorithm="interior-point"); [x,fval,exitflag] = linprog(f,A,b,Aeq,beq,lb,ub,options);
コード生成では次のオプションをサポートしています。
Algorithm—"interior-point"でなければなりませんConstraintToleranceDisplay— 表示なしの場合は"off"、"none"、または"final"、反復表示の場合は"iter"として指定MaxIterationsOptimalityTolerance
生成コードでは、オプションに対して限られたエラー チェックしか行われません。オプションの更新方法として、
optimoptionsではなく、ドット表記を使用することを推奨します。opts = optimoptions("linprog",Algorithm="interior-point"); opts = optimoptions(opts,MaxIterations=1e4); % Not recommended opts.MaxIterations = 1e4; % Recommended
linprogは、コードで作成されたオプションだけでなく、ソルバーに渡されたオプションをサポートします。サポートされていないオプションを指定すると、通常はコード生成の際にそのオプションは無視されます。信頼できる結果を得るために、サポートされているオプションのみを指定します。
非マルチスレッドな生成コード
既定では、MATLAB 環境外で使用するために生成されたコードは、非マルチスレッドな線形代数ライブラリを使用します。したがって、このコードの実行速度は、MATLAB 環境のコードよりも著しく低速になる可能性があります。
ターゲット ハードウェアに複数のコアが搭載されている場合、カスタム マルチスレッド LAPACK および BLAS ライブラリを使用することにより、パフォーマンスの向上が期待できます。これらのライブラリを生成コードに組み込む方法の詳細については、生成されたスタンドアロン コードでの LAPACK 呼び出しを使用した線形代数の高速化 (MATLAB Coder)を参照してください。
参考
linprog | codegen (MATLAB Coder) | optimoptions | optim.coder.infbound