問題タブ [ublas]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
1361 参照

c++ - 定数項の 1 つだけが変化する場合の線形システム Ax= b の効率的な解

少数の定数項のみが変化する場合、大規模な線形方程式系を効率的に解くにはどうすればよいでしょうか。例えば:

私は現在、システム Ax= b を持っています。A の逆数を 1 回計算して行列に格納し、b のエントリが更新されるたびに、行列とベクトルの乗算 A^-1(b) を実行して x を再計算します。

これは、b で更新されるエントリが 2 つしかないため、非効率的です。A-1 は一定のままで、特定の既知の値が b で変化する場合、このシステムを解くより効率的な方法はありますか?

私は uBlas と Eigen を使用していますが、この選択的再計算の問題に対処するソリューションを知りません。ご指導ありがとうございます。

0 投票する
2 に答える
4735 参照

c++ - 次の例で Eigen が ublas よりも 5 倍遅いのはなぜですか?

Eigen バージョンでは、「真の」固定サイズの行列とベクトル、より優れたアルゴリズム (uBlas での LDLT と LU) を使用し、内部で SIMD 命令を使用します。では、次の例で uBlas よりも遅いのはなぜですか?

私は何か間違ったことをしていると確信しています.Eigenより高速であるか、少なくとも同等である必要があります.

出力は次のとおりです。

(Visual Studio 2010 x64 リリース)


編集

為に

出力は次のとおりです。

このような動作は、uBlas バージョンがその場で因数分解を計算するのに対し、Eigen バージョンは行列の COPY (LDLT) を作成するためだと思います。そのため、キャッシュにうまく適合しません。

Eigenでインプレース計算を行う方法はありますか? それとも、それを改善する他の方法がありますか?


編集:

Fezvez のアドバイスに従って、LDLT の代わりに LLT を使用すると、次のようになります。

それは良いことですが、それでも不必要な行列スタック割り当てを行います:

私はそれを避けることを好みます-それはさらに速くなるはずです。


編集:

LDLT (内部マトリックスは保護されています) からサブクラス化し、直接入力することにより、割り当てを削除しました。LDLT の結果は次のようになります。

それは機能しますが、回避策です-実際の解決策ではありません...

LLT からのサブクラス化も機能しますが、それほど大きな効果はありません。

0 投票する
1 に答える
1658 参照

linear-regression - 重みが変化したときの重み付き最小二乗回帰の効率的な再計算

ウィキで説明されているように、加重最小二乗回帰を実行しています:WLS

この方程式を解く必要があります:$ B =(t(X)W X)^ {-1} * t(X)W y $

私はSVDを使用して、$(t(X)W X)^ {-1} $を見つけ、それを行列に格納します。さらに、行列$ H =(t(X)W X)^ {-1} * t(X)W $を格納し、yの新しい値に対して次のようにします。B= Hy。このようにして、yの変化に応じてSVDと行列の乗算を繰り返すコストを節約できます。

Wは対角行列であり、通常は変化しません。ただし、W行列の対角線上の1つまたは2つの要素を変更することがあります。その場合、SVDを再度実行し、H行列を再計算する必要があります。これは明らかに遅く、時間がかかります。

私の質問は次のとおりです。Wで何が変更され、Xで何も変更されていない場合、(t(X)W X)^-1を再計算するためのより効率的な方法はありますか?

言い換えると、Wの対角要素のみが既知の量だけ変化する可能性がある場合、Bを見つけるための効率的な分析方法はありますか?

0 投票する
1 に答える
308 参照

c++ - Boost UBLASを使用して2次形式を計算するにはどうすればよいですか?

Boost UBLASを使用して(x-mu)^ T * SigmaInverse *(x-mu)を計算しようとしています。ここで、xとmuはベクトルで、SigmaInverseは行列です。コードは次のようになります。

そして私はこのエラーを受け取ります:

私は何を間違っているのですか、どうすればそれを機能させることができますか?

0 投票する
1 に答える
1537 参照

c++ - ブースト ublas を使用して再帰的なテンプレートのインスタンス化エラーを理解し、修正するにはどうすればよいですか?

コンパイラ エラーが発生する

clang++ から、または g++ 4.2.1 からの 10GB を超えるメモリ使用量での無期限コンパイルから。

ベクトルの各要素からスカラーを減算するヘルパー関数を作成しようとしています。最初は一般的に考えて、特定のベクター ストレージ型をテンプレート パラメーターにすることを計画しました。そうは言っても、この時点で (特殊化せずに)ublasとベクトルの両方で定義を機能させる方法がわからないことに気付きました。stdしかし、私はまだ何が起こっているのか疑問に思っています/私のコンパイルの問題の理由は?

この問題は、boost ライブラリに準拠している場合、以下のコードで簡単に示されます。 g++ -I/path/boost bug_demo.cpp

ブーストまたはコードにバグはありますか?

0 投票する
0 に答える
445 参照

c++ - 多倍数の行列積のブースト

VS 2010 Express で Boost.Multiprecision と Boost.uBLAS を使用して、C++ で高精度の計算を実装しようとしています。ただし、最も単純なケースでも、コードのコンパイルに失敗し、次のエラーが発生します。

エラー C2677: バイナリ '+=' : タイプ 'boost::multiprecision::detail::expression' を取るグローバル演算子が見つかりません (または、受け入れ可能な変換がありません) c:\program files (x86)\boost_1_53_0\boost\numeric \ublas\functional.hpp 1176

コンパイラが不平を言う行は、ublas の Functional.hpp にあります。

number<cpp_dec_float<50> >高精度浮動小数点数の型として aを使用し、 2 つの行列 E と m をインスタンス化します - これは問題なく動作します。ただし、prod を使用してそれらを乗算しようとすると、コードはコンパイルに失敗します。ここで利用可能なMultiprecision FAQは、 pro のすべての引数を高精度型に明示的にキャストすることを提案していますが、prod(static_cast<matrix<number<cpp_dec_float<50> > > >(E),static_cast<matrix<number<cpp_dec_float<50> > > >(m) )役に立ちません。

まだ何が欠けているのでしょうか?前もって感謝します。

0 投票する
0 に答える
218 参照

c++ - Boost :: uBlas :: vectorの要素のサブセットに対して操作を実行する方法は?

長いブースト::numeric:: ublas :: vectorがあり、要素のサブセットに対して更新操作を実行するとします。更新する必要のある要素の数は、「すべて」または「なし」の間のどこかにあります。更新する要素は、更新する必要のある要素ごとに「1」を含むスパースcompressed_vectorによって指定されます。

この問題を解決するには、次の2つの方法が考えられます。

  1. 右側にマスクを掛けるだけです。

    これに伴う問題は、それが非常に非効率に見えることです。ublasはベクトル全体を計算してから、この場合(つまり、update_mask == 0の場合)すべての未使用の値を破棄しませんか?

    ただよりも遅くなると思います

    更新する必要のある要素が少ない場合、これはひどく非効率的です。

  2. すべての値をループして更新します

    これに伴う問題は、a)見た目がひどい、b)そもそもベクトルを使用する目的をやや損なう、c。)多くのインデックスを更新する場合、および/または操作がより複雑になる場合、ひどく非効率になるはずであるということです。 。

これを効率的に行う方法について何かアイデアはありますか?これはかなり一般的な問題であると確信していますが、それについて役立つものは何も見つかりませんでした(そして、ublasのドキュメントは...面白くありません)。

0 投票する
1 に答える
196 参照

c++ - バイナリ ファイルから ublas ベクトルを読み取るか、array[] で初期化します

(一度に 1 つの要素を読み取るのではなく) 次のような方法でバイナリ ファイルから ublas ベクトルを読み取ることができないのはなぜですか。

配列から ublas ベクトルを初期化する方法はありますか?