問題タブ [boost-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 投票する
1 に答える
1112 参照

c++ - Boost ublas 行列をテキスト ファイルに書き込む

Boost ublas 行列があり、その内容をテキスト ファイルに出力したいと考えています。次の実装があり、動作します。

ネストされた for ループを使用せずに、このコードを記述したいと考えています。次のように ostreambuf_iterator API を試しました

ただし、ご覧のとおり、連続する要素は新しい行に記述されており、ネストされた for ループで行ったような順序付けのタイプを実現できませんでした。STLアルゴリズムを使用するためにネストされた内部で行ったことを行う方法はありますか?

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

c++ - 決して実行されない関数呼び出しのために、プログラムは必要以上に (かなり) 時間がかかります

私は現在、C++ で書かれたベイジアン最適化を実行しています。Ruben Martinez-Cantin ( http://rmcantin.bitbucket.org/html/ ) のツールボックス コール Bayesopt を使用します。ベイジアン最適化に関する論文を書いています ( https://en.wikipedia.org/wiki/Bayesian_optimization )。

以前にこのツールボックスを試したことがありますが、今週、コードの実行が記憶よりもずっと遅いことに気付きました。このツールボックスで動作するコードをいくつか書きました。

なぜこれが起こっているのかを理解しようと決心したところ、コードの実行が本来よりもはるかに遅くなっていることを目の当たりにしました。

それが私のコードのせいなのか、そうでないのかを理解するために、私のコードを一切使用しない例を試してみました。

次の例を検討してください。

この例だけをコンパイルすると、実行時間は約 23 秒です。

このcmakeファイルで

ここで、同じメインの例を考えてみましょう。ただし、cmake プロジェクトに 3 つのファイルを追加します (main.cpp には含めません)。これら 3 つのファイルは、すべてのコードの一部です。

今回の走行時間は約3分。これは私の仕事にとって非常に重要です。増加par.n_iterationsすると悪化する傾向があるからです。

さらに、TGPNode.cpp の行にコメントを付けると、次のような結論に達しました。

私は23秒を取得します。この関数は、bayesopt ツールボックスのファイル ublas_cholesky.hpp に属しています。

ツールボックス コード内でも同じ関数が呼び出されることに注意することも重要です。この行はコメント化されておらず、実行中に実行されmichalewicz.optimize(result);ます。

なぜこれが起こっているのか誰にも分かりますか?誰かが主題についての洞察を持っているなら、それは大きな助けになるでしょう.

大変感謝しています。

親切に、 ホセ・ノゲイラ

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

c++ - Boost Ublas lu_Factorize 使用時のエラー

BOOST Ublas を使用して行列べき乗関数を作成する楽しいプロジェクトを作成しようとしています。このNumpy ライブラリの行列のべき乗関数と非常によく似ています。行列指数を使用して、行列の n 乗を対数時間で計算します。行列の n 乗を計算するには、次の 3 つのケースがあります。

  1. べき乗 > 0 の場合は、行列の累乗を直接使用します
  2. べき乗 = 0 の場合、行列に逆行列があるかどうかをチェックし (lu_factorize を使用してチェック)、ある場合は単位行列を返します。
  3. べき乗< 0 の場合、逆行列 (存在する場合)を見つけてから、 行列累乗を使用します。

私はアルゴリズムと実装に長けていますが、オープン ソース ライブラリを使用するのはこれが初めてです。これを学びたいので、最終的にブーストに貢献できます。

これは私のヘッダーファイルです

これを使用してこのヘッダーファイルをテストしています

関数は、累乗 > 0 に対して完全に正常に機能します。これは、行列の累乗を直接使用するためです。反復乗算よりもはるかに高速に動作します。約1000回の反復で、これの実行時間とループの使用時間が100〜1000倍異なることがわかりました。あなたはそれを観察することができますが、べき乗 <=0,i の場合、時々間違った答えが得られます。(行列と逆行列の積が単位行列であるという考えを使用してこれを確認しました)

これはおそらく、 変数の型が正しいことを確認する特定のチェックを行うlu_factorize および lu_substitute と関係があります。

lu_factorize のドキュメントがないため、使用方法がわかりません。( Ublas の lu_factorize と lu_substitute を使用して逆行列を計算する例をここで読んだだけです)。ソース コードも読んでいますが、コードは経験不足のためあまり理解していません。

現在発生している問題についていくつか質問があります。これはブーストの私の最初の試みなので、私が愚かなことを尋ねても、私に厳しくしないでください. これらは私の質問です -

  1. 間違った答えは、おそらくデータ型の間の変換が正しくないか、または同様のものによるものです。どうすればこれを解決できますか? すべてのステップで正しいデータ型を確実に使用するにはどうすればよいですか?
  2. ユーザーが間違った型を入力したときにエラーを出すにはどうすればよいですか。ブーストアサートを使用できることはわかっていますが、理解できないコンパイルエラーが大量に発生しています。入力タイプが有効であることを確認する最も簡単な方法は何ですか。たとえば、ユーザーが入力用の文字列を指定した場合にエラーを発生させたいとします。これについて例を挙げていただけますか?
  3. コンパイル エラーを解決するためにさまざまな方法を試しましたが、そのうちの 1 つは#define BOOST_UBLAS_TYPE_CHECK 0を使用することでし た。この場合、少なくともそれがどのように機能するか説明できますか?

  4. ブーストから何かを作るのはこれが初めての試みなので、これは確かにもっと良くできることは理解できます. エラー処理、複数コンパイラのサポートなどのライブラリ標準を保証するために、このヘッダー ファイルに存在する必要がある他のものは何ですか?

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

c++ - クラスに新しい関数を追加した後、アプリケーションはコンパイルされますが、リンク段階で失敗するのはなぜですか?

私のプロジェクトは以下を使用して構築されています: Eclipse, CMakeLists.txt, MinGW 4.8.1

プロジェクトが正常にコンパイルされ、アプリケーションがリンクされます。しかし、追加した後、

タイプ boost::ublas::matrix の 'Helper.cpp' の 3 つの関数と 'CamData.cpp' の 2 つの関数

リンカーはあきらめ、関数を見つけることができなくなります(未定義参照エラー)が、関数をコンパイルできます (オブジェクト ファイル *.cpp.obj のコンパイル中にエラーは発生しません)。

コード構造

作成した Helper クラスの関数は以下の通りです。CamData の 2 つの関数も同様のタイプです。

cmakelist.txt の関連部分は次のとおりです。

main.cpp の関数とその呼び出しをコメントアウトした後、プログラムを再度リンクできます。これを引き起こしている可能性のあるアイデアはありますか?

以下のエラーログ

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

c++ - C++ テンプレートと OpenBLAS

Eigen や Boost::uBlas など、行列の型と計算を実装する C++ ライブラリが存在します。

LAPACK、Goto-BLAS、OpenBLAS、ATLAS など、浮動小数点型に対して高度に最適化された密な行列計算を実装するライブラリも存在します。

おそらく特殊化によって、一部の C++ ライブラリが、OpenBLAS でサポートされている型に対して OpenBLAS を呼び出すかどうか疑問に思っていました。それは両方の長所のように思えます。