問題タブ [eigen]
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.
c++ - OpenMP と Eigen を使用すると無限ループ/デッドロックが発生する
私はもっと大きな問題を解決していて、OpenMP を使用していくつかのループを並列化しようとするとバグに遭遇しました。私自身のコードを模倣した以下のいくつかの単純なコードで問題を再現しました。
問題は、プログラムを実行すると、ある種の無限ループ/デッドロックがランダムに発生することです (CPU は 100% ですが、何もしません)。私のテストからわかることから、スレッドの 1 つが行列 - 行列の積を計算しようとしますが、何らかの理由で終了しません。
OpenMP を有効にすると、Eigen は OpenMP を使用して行列製品を並列化することを知っています。この外側に別の並列ループも追加しています。ただし、EIGEN_DONT_PARALLELIZE を定義して Eigen の並列化を無効にすると、このバグは依然として発生します。
Eigen 3.0.4 を搭載した MacOS 10.6.8 で gcc バージョン 4.6.0 20101127 を使用しています。
何がうまくいかないのかわかりません...
c++ - Python で固有オブジェクトを使用する
Python で Eigen オブジェクトを使用するには、どのようなリソースがありますか? 私は PyEigen を認識していますが、新しい開発を見つけることができないようです。他に何かありますか?
c++ - コンポーネントごとの条件付き/固有値で区分的に定義された演算
(疑似コード)のような固有値を使用して実装する方法はありますか:
ここで、すべての変数は Eigen::Array のものです。つまり、X の各コンポーネントについて、そのコンポーネントの BooleanExpr が true の場合、A の対応するコンポーネントは ExprTrue として計算され、それ以外の場合は ExprFalse として計算されます。
私は現時点で次のように実装しています:
しかし、これは各コンポーネントで両方の Expr* を計算するため、Expr が高価な場合には適切ではありません。
実際、これを X の区分的に定義された関数に一般化したいので、(疑似コード) のようなものを計算できます。
これは、X の成分に対する整数式の結果であり、A の対応する成分を計算するために使用される式を決定します。
私はそれについて間違った方向に進んでいるだけで、すでに固有値で同じ結果を達成する方法があるかもしれませんが、私はそれを理解できません。
c++ - Eigen::Vector を点のベクトルのように見せる
ポイントのベクトルであるかのように操作できるように 2D 形状を表現したいと考えています。特に、演算子[]
とそのat()
上で呼び出して、2D ポイントのように機能するものへの参照を返すことができるようにしたいと考えています。現在、唯一のメンバー変数がポイントのベクトルであり、その要素に対してさまざまな算術演算および幾何学的演算が定義されているクラスを使用しています。
ただし、コードの他の部分では、n 点のベクトルを 2n 次元空間の要素として扱い、基本的な線形代数を実行する必要があります (たとえば、ベクトルを R^2n の特定の部分空間に射影します)。現在Eigen::VectorXd
、これを行うたびにオブジェクトを作成し、これらの操作を実行した後に元に戻しています。私はこれをしたくありません。なぜなら、すべてのコピーが非効率の明らかな原因となるほど頻繁に変換を行うからです。
データを double/floats/int のフラットな配列として格納する場合、その n 番目の要素へのポインターを Point へのポインターにキャストできます (そのメンバーは double/floats/int のペアになります)。ただし、Eigen がベクトルに使用する内部表現がわからないため (そして変更される可能性があります)、これは不可能です。
これを解決する賢明な方法はありますか?どこでも sを使用できますEigen::Vector
が、ほとんどのコードで、一連の点を扱っているふりをできるようにしたいと考えています。
c++ - 依存するアタッチされたオブジェクトのチェーンで回転変換を実行する最速の方法
隣接する面の4つの頂点がメモリ内で同じ頂点になるように、2種類(たとえば2つ、実際にはn> 1)の長方形のプリズムが「互いに接続されている」と仮定します。つまり、2つの木製ブロックのように、一方が他方に積み重ねられ、下部に4つの頂点、2つの間で共有される中央に4つ、上部に4つの頂点があります。ここで、最初に「上部」の木製ブロックで特定の回転を実行できるようにします。これは、4つの共有頂点の中心点を持つヒンジ上にあるかのようになります。
したがって、肘のように、特定の角度で最大45度までしか曲がることができないとしましょう。回転を実行するには、オブジェクトを構成する8つの頂点をその見えないヒンジの中心点の周りで回転させます。その過程で、他のブロックの4つの共有頂点は多少移動しますが、ヒンジがそれらの間の中心点であるため、下部のブロックから「移動」することはありません。それらを木製と呼ぶのは、特定の方法で変形するため、直感に反していると思いますが、私はそれを視覚化するように設定しようとしていました。とにかく、この下部ブロックを別の方法で回転できるようにしたいが、上部ブロックを取り付けられているように動作させたいとしましょう。したがって、下部のブロックが移動すると、上部のブロックも一緒に振り回されますが、それらの間のヒンジにある屈曲もあります。
「一番上の」ブロックから始めて、依存関係チェーンを下に向かって、現在のブロックとその「上の」ブロックのすべての頂点で回転を実行して、軸角度またはクォータニオンを介して段階的に変換を行うことを検討していました。ただし、これには、このチェーンの各ステップで、現在のヒンジを原点として配置するためにすべての頂点をオフセットし、回転を実行してから、前のオフセットを逆にする必要があります。これを処理するより効率的な方法はありますか?つまり、速度の効率は、メモリに追加の前処理されたデータがあることは大したことではありません。また、このような線形の依存関係チェーンを期待できない場合もあります(たとえば、上部のブロックが下部のブロックに接続されてリングを形成するなど)。
c++ - Eigen ライブラリ構文の問題を使用してコードがコンパイルされない可能性がありますか?
コンパイルすると、このエラー test.cpp:2:23: error: Eigen/Dense: No such file or directory が表示されます
ただし、Eigen/Dense は存在します。私の cpp ファイルは、/Eigen があるディレクトリにあります。誰か助けてもらえますか?
c++ - 関数の引数としてのEigenVector4d?
Eigen :: Vector4dを次のような関数に渡そうとしています:
VC ++ 2005コンパイラは、次のエラーを出します。
エラーC2719:'quat':__declspec(align('16'))を含む正式なパラメーターは整列されません
これは、引数としてのEigen::Vector3dオブジェクトでは発生しません。いくつかのオンラインディスカッションで、Vector4dクラスは、他の既定のtypedefよりも、その配置について特に注意が必要であることに気付きました。クラスでVector4dを使用する場合、それらに引数を渡すための同様の回避策はありますか?EIGEN_MAKE_ALIGNED_OPERATOR_NEW
をオーバーライドするマクロを使用する必要があることがわかりました。new
c++ - Eigen operator() への関数ポインタを取得するにはどうすればよいですか
固有行列の operator() 関数への関数ポインタが必要です。具体的には、単一のインデックスを取る operator() Eigen の VectorXi 行列クラスです。つまり、呼び出すときに使用している演算子は次のとおりです。
私が試したことは次のとおりです。
しかし、これは私に非常に長いエラーを与えます:
この演算子への関数ポインタを取得する正しい方法は何ですか?
c++ - memcpy が固有行列データのコピーに失敗するのに、std::copy は成功するのはなぜですか?
Eigen を使用して行列を作成すると、次のようになります。
生産する
各要素を出力して、データをポインターで移動できます。
生産する
std::copy を使用してスタック上の同じ型の配列にコピーし、その配列の要素を出力することもできます。
生産する
ただし、 memcpy を使用して同等のコピーを行うことはできないようです。これは、最初の要素のみをコピーすることを管理します:
生産する
memcpy が期待どおりに動作しない正当な理由はありますか? (それとも私の使い方が悪いのでしょうか?)
c++ - テンプレートのインスタンス化-特定のクラスでC++11のsizeof...()演算子を使用する場合、一致する関数はありません
Eigen 3ライブラリ(http://eigen.tuxfamily.org)を使用する次のコード(C ++ 11)について考えてみます。
クラス「mat」は、エラーが独自のクラスを使用して発生するのではなく、Eigen::Matrixクラスを使用してのみ発生することを示すためにあります。
誰かがこれが起こっている理由や手がかりを思い付くことができますか?または解決策を投稿しますか?
ありがとうございました!
編集:ubuntu11.10でg++4.6.1を使用します。コンパイラの出力は次のとおりです。
EDIT2:私は十分に明確ではなかったと思います:私が最も驚いたのは、2番目のテンプレートパラメーターとして固定値を渡すと(bar()の最後の2行のように)、sizeofを使用するだけですべてが正常に機能することです...( )演算子は、Eigen::Matrixで使用した場合にのみエラーになります。