2017-02-13 12 views
1

私は拘束線形最小二乗問題の解を計算しています:Cm x 7bあるlsqlin最適化計算(MATLAB)次のように

lb = zeros(7,1); 
ub = ones(7,1); 
for i = 1:size(b,2) 
    x(:,i) = lsqlin(C,b(:,i),[],[],[],[],lb,ub); 
end 

m x nです。 nは非常に大きく、計算時間が遅くなります。この手順をスピードアップし、遅いループを取り除く方法はありますか?forループ。私は0~1(lbub)の境界に私の解決策を制約する必要があるので、pinvまたは\の代わりにlsqlinを使用しています。

+0

いつでもデフォルトソルバーを切り替えることができます。 '' 'interior-point'''を試してみてください。そのループが何であるか、そして私たちがそれに取り組むと期待しているかどうかはわかりません。 – sascha

+0

私はさまざまなソルバーを試しましたが、問題は同じです。私は 'x = lsqlin(C、b、[]、[]、[]、[]、lb、ub)を与えようとするとforループを使用しています;エラーです。一方、 'pinv(C)* b'​​や' C \ b'を使うと、それは魅力的ですが、 'lsqlin'では' for'ループを通してやる必要があります。私は 'lsqlin'を使う必要があります。したがって、 'for'ループを最適化または破棄する可能性があるかどうかを尋ねています。 – ThT

答えて

2

ループが必ずしも遅くなる理由ではありません。事前割り当てはしていません。lsqlinはおそらく各反復ごとにたくさんのものを印刷しています。しかし、C行列を疎ブロック対角行列C2に置き換えてn同一ブロック(see here)とすることで、これを高速化することができます。これは、すべてのn問題を一度に解決します。新しいC2がスパースでない場合は、さらに多くのメモリを使用する可能性があり、計算にはループよりもはるかに時間がかかることがあります。

n = size(b,2); 
C2 = kron(speye(n),C); 
b2 = b(:); 
lb2 = repmat(lb,n,1); % or zeros(7*n,1); 
ub2 = repmat(ub,n,1); % or ones(7*n,1); 
opts = optimoptions(@lsqlin,'Algorithm','interior-point','Display','off'); 
x = lsqlin(C2,b2,[],[],[],[],lb2,ub2,[],opts); 

optimoptionsを使用して、私はspecified the algorithmをしましたし、任意の出力や警告は計算を遅くしていないことを確認する'off'から'Display'を設定します。

私のマシンでは、forループ(適切な事前割り当てと設定オプションを使用)よりも6〜10倍高速です。この方法では、のマトリックスがm*n*7の要素を持つ疎のメモリがメモリに収まることが前提です。そうでない場合はforループベースのアプローチが唯一の選択肢になります(lsqlinの独自のバージョンを作成するか、問題のその他の冗長性を利用する以外)。

+0

あなたの答えに多くの感謝。あなたのソリューションは、トリック;-)を作るようだ。私はメッセージを持っていましたが、事前割り当てはしませんでした(次のことは試してみる予定でした)が、スパースブロック対角行列を使用することは私が気づいていないトリックです。もう一度あなたの助けをありがとう。 – ThT

+0

もう1つの質問。どの程度最適なのは、疎なブロック対角行列の使用であり、メモリ的なものです。たとえば、私の場合、私はサイズ 'C'(193200x7)' b'(193200x16450)以上の行列を扱わなければならないので、以前は言及していませんでした。あなたのソリューションを実際に試してみると分かるように、私はメモリに関する問題を抱えています(250GbはC2の事前割り当てには不十分です)。それについてのヒント? – ThT

+0

私はあなたの質問で「n」が大きかったので、「m」は「n」よりも小さいと仮定していました。あなたのまばらな 'C2'は、193200x7x16450の配列とほぼ同じメモリを必要とします(16450倍のフル配列とは対照的です)。あなたの 'b'は既に私のバージョンのMatlabのデフォルトの最大配列サイズよりも大きくなっています(おそらく限界を変更するために設定に入っていたはずです)。 'for'ループは、システムの他の部分がまばらでない限り、あなたがメモリにバインドされている場合に行く方法です。 – horchler

関連する問題