このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
線形最小二乗のコード生成: 背景
コード生成とは
コード生成とは、MATLAB® Coder™ を使用した、MATLAB コードから C コードへの変換です。コード生成には、MATLABCoder ライセンスが必要です。
コード生成は通常、MATLAB を実行していないハードウェアにコードを展開するために使用します。たとえば、動きや計画を最適化するために lsqlin
を使用して、ロボットにコードを展開できます。
例については、lsqlin のコード生成を参照してください。他の最適化ソルバーでのコード生成については、fmincon のコード生成、quadprog のコード生成、lsqcurvefit または lsqnonlin の用のコード生成、またはfsolve のコード生成を参照してください。
コード生成に関する要件
lsqlin
は、関数codegen
(MATLAB Coder) または MATLAB Coder アプリを使用したコード生成をサポートしています。コードを生成するには MATLAB Coder ライセンスが必要です。ターゲット ハードウェアは、標準的な倍精度浮動小数点計算をサポートしていなければなりません。単精度計算や固定小数点計算のコードは生成できません。
コード生成ターゲットは、MATLAB ソルバーと同じ数学カーネル ライブラリを使用しません。そのため、コード生成解法は、特に、条件付けが不十分な問題の場合に、ソルバー解法と異なる可能性があります。
MATLAB で制約なし問題や劣決定問題の解を求める場合、
lsqlin
がmldivide
を呼び出すことで、基底解が返ります。コード生成で返ってくるのは最小ノルム解で、これは通常、一意に定まることはありません。コード生成の場合、
lsqlin
はproblem
引数をサポートしていません。[x,fval] = lsqlin(problem) % Not supported
lsqlin
の入力行列 (A
、Aeq
、lb
、ub
など) はすべてフル (非スパース) でなければなりません。関数full
を使用することで、スパース行列を非スパースに変換できます。lb
引数とub
引数は、C
の列数と同じ数のエントリをもつか、空[]
でなければなりません。ターゲット ハードウェアが無限境界をサポートしていない場合は、
optim.coder.infbound
を使用します。組み込みプロセッサを使用する高度なコード最適化には、Embedded Coder® ライセンスも必要です。
lsqlin
のオプションを含め、関数optimoptions
を使用して指定しなければなりません。オプションにはAlgorithm
オプションを含め、'active-set'
に設定しなければなりません。options = optimoptions('lsqlin','Algorithm','active-set'); [x,fval,exitflag] = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0,options);
コード生成では次のオプションをサポートしています。
Algorithm
—'active-set'
でなければなりませんConstraintTolerance
MaxIterations
ObjectiveLimit
OptimalityTolerance
StepTolerance
生成コードでは、オプションに対して限られたエラー チェックしか行われません。オプションの更新方法として、ドット表記ではなく、
optimoptions
を使用することを推奨します。opts = optimoptions('lsqlin','Algorithm','active-set'); opts = optimoptions(opts,'MaxIterations',1e4); % Recommended opts.MaxIterations = 1e4; % Not recommended
オプションはファイルから読み込まないでください。そうした場合、コード生成に失敗することがあります。代わりに、コード内でオプションを作成してください。
サポートされていないオプションを指定すると、通常はコード生成の際にそのオプションは無視されます。信頼できる結果を得るために、サポートされているオプションのみを指定します。
非マルチスレッドな生成コード
既定では、MATLAB 環境外で使用するために生成されたコードは、非マルチスレッドな線形代数ライブラリを使用します。したがって、このコードの実行速度は、MATLAB 環境のコードよりも著しく低速になる可能性があります。
ターゲット ハードウェアに複数のコアが搭載されている場合、カスタム マルチスレッド LAPACK および BLAS ライブラリを使用することにより、パフォーマンスの向上が期待できます。これらのライブラリを生成コードに組み込むには、生成されたスタンドアロン コードでの LAPACK 呼び出しを使用した線形代数の高速化 (MATLAB Coder)を参照してください。
参考
codegen
(MATLAB Coder) | optimoptions
| lsqlin
| quadprog
| optim.coder.infbound