問題タブ [boost-multi-array]
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.
memory-management - 大きな 3D ボリューム bad_alloc
図全体を格納するために動的に割り当てられたブースト multi_array を使用して、3D 点群から作成された 3D ボロノイ図を作成するアプリケーションを開発しています。
私が使用しているテスト ケースの 1 つは大量のメモリ (約 [600][600][600]) を必要とし、これは許容される制限を超えており、bad_alloc になります。
すでにダイアグラムを細かく分割しようとしましたが、合計メモリがすでに制限を超えているように見えるため、機能しません。
私の質問は、PC の制約の下でこのような大きな 3D ボリュームを操作するにはどうすればよいですか?
*編集
Element 型は次のような構造体です。
要素は、3D 空間での位置に基づいて multiarray でインデックス付けされます。
複数配列は、ファイルからスペース上の特定のポイントを設定し、スペース全体に前方および後方マスクを渡すことによって中間スペースを埋めることによって構築されます。
前もって感謝します
c++ - マルチアレイ 3D のブースト
次のように、2Dにブーストマルチアレイを使用しています。
今私はそれを実装しようとしていますが、3Dの場合、これまでのところ次のように書いています。
しかし、次の部分はまだわかりにくいので、やり方を教えて、少し説明してもらえますか?
ありがとう!
c++ - 任意の boost::multi_array の d 次元を除くすべての次元を反復します
次元配列の次元にf()
沿って演算を適用したいことがよくあります。これは、 の残りのすべての次元をループすることを意味します。これができるかどうかを調べてみました。関数は、 、 、およびを含むすべての種類の で動作する必要があり、理想的には などの右辺値型でも動作する必要があります。d
N
A
A
boost::multi_array
f(A)
boost::multi_array
boost:multi_array_ref
boost::detail::multi_array::sub_array
boost::detail::multi_array::array_view
boost::multi_array_ref<T, NDims>::reference
私が思いついた最善の方法はreshape()
、作業次元が常に中央の次元になるように、ND 配列を 3D 配列に再形成するために使用できる関数の実装です。ここにあるf.hpp
:
これはテストプログラムtest.cpp
です:
明らかに、このアプローチには問題があります。つまり、スライスが に渡されるf()
と、メモリが連続しなくなり、 の実装が無効になりreshape()
ます。
より良い (より C++ に似た) 方法は、指定された次元に沿った非ユニティ ストライドを自動的に処理するため、ブースト型が提供する反復子から集計反復子を構築することです。boost::detail::multi_array::index_gen
関連しているように見えますが、これを使用して dimension 内のすべてのスライスに対してイテレータを作成する方法がよくわかりませんd
。何か案は?
ノート:
SOにはすでに同様の質問がありますが、どれも私にとって非常に満足のいくものではありませんでした。N = 3
またはの特殊なソリューションには興味がありませんN = 2
。どんなものでもうまくいくはずN
です。
アップデート:
これは私がPythonで欲しいものと同等です:
の機能を使用して何とか同じことが可能になるはずですindex_gen.hpp
が、私はまだその方法を理解できていません。
c++ - Boost MultiArrays のパフォーマンスが低い
ブースト マルチアレイのパフォーマンスが STL Vector に比べて非常に悪いことに気付きました。以前に尋ねられたこの質問に出くわしました。最も気に入った回答は、
1) ブーストはネイティブ アレイとほぼ同じ速度です
2) Boost MultiArray から最高のパフォーマンスを得るには、データ要素にアクセスする順序を変更する必要があります。また、デバッグではなく、リリース モードで実行する必要があります。
まあ、私はそれをすべてやりましたが、それでも私の MultiArray のパフォーマンスはかなりお粗末です。
ここにコードを投稿しています:
A) デフォルトの順序で
B) 逆順の場合
すべての可能な順列で、私のベンチマークはほぼ同じです:
1) ネイティブ コードの場合: 0.15 秒
2) Boost MultiArray の場合: 1.0s
Visual Studio 2010 を使用しています。
私の質問は: Visual Studio を使用している場合、Boost MultiArrays から優れたパフォーマンスを得るにはどうすればよいですか?
アップデート :
Visual Studio 2013 に切り替えました。そこで、Qvec-report2 コンパイラ スイッチを有効にしました。そして非常に興味深いことに、コンパイルすると、コンパイラーがベクトル化に失敗したという情報メッセージを受け取り始めました。以下は、ほとんど警告のように見える情報メッセージの例です。最も単純なコードに対して、そのようなメッセージをいくつか受け取りました。
--- 解析関数: void __cdecl `vector constructor iterator'(void * __ptr64,unsigned __int64,int,void * __ptr64 (__cdecl*)(void * __ptr64)) 1> D:\Workspace\test\Scrap\Scrap\Source .cpp : 情報 C5002: ループは理由 '1301' によりベクトル化されませんでした
これは、Boost マルチアレイが GCC では問題なく動作するのに、Visual Studio では動作が遅い理由についての主要な手がかりだと思います。この追加情報を踏まえて、問題を解決する方法を考えていただけますか?
@Admins : 以前に回答した質問のマークを外してください。大幅な編集を行いました。
c++ - [] および () アクセス操作をサポートするように 2D 配列を定義する
C++ で画像処理アプリケーションを作成しています。イメージ タイプを定義するために、ブースト マルチ アレイ、ブースト ublas マトリックス、または Eigen 2D マトリックスのいずれかを使用することを検討しています。私が行おうとしているすべてのさまざまな操作について、これらを慎重にベンチマークし、それに応じて 1 つを選択したいと思います。
しかし、開発を中断する余裕はありません。したがって、画像タイプの定義を ublas、Eigen、または multiarray から別のものに簡単に交換できるようにコードを書き始めたいと思います。これらのライブラリでは要素アクセサー演算子が異なるため、typedef がここで私を救うとは思いません。
たとえば、3 つのライブラリのそれぞれで次のように 2D 配列 'myArray' の要素にアクセスします。 Boost multiarray : myArray[x][y] Boost ublas : myArray (x,y)
[][] と ( _ 、 _ ) の要素へのアクセス方法の間に競合があることがわかります。したがって、単純な typedef を使用して、ある型のコードを記述し、別の型で動作させることはできません。
これを回避する方法はありますか?
基になる型を、アクセス方法を標準化する新しいユニバーサル型にラップすることを考えています。その後、typedef を使用して、ある型を別の型に簡単に交換できます。心配すべき落とし穴はありますか? それは私に多くの効率を要しますか?ここで最も活用できる言語機能は何ですか?
始めるのを手伝っていただければ、コードを書いてここに貼り付けて、さらに確認します。PS 私はこれら 3 つのタイプの豊富な API を使用していません。私は単にそれらを作成し、それらの要素にアクセスしています。
visual-studio - ブースト マルチアレイは警告をベクトル化できません
Visual Studio 2013 で Boost MultiArrays を使用しています。Visual STudio のネイティブ x64 C++ コンパイラを使用して Boost をコンパイルしました。タイプ「info C5002」の警告がたくさん表示されます。警告の横に、警告の理由コードも表示されます。これが私のコードと、私が受け取る警告の小さなサンプルです。
警告の例:
1> --- 解析関数: bool __cdecl std::_Equal<__int64 const * __ptr64,__int64 const * __ptr64>(__int64 const * __ptr64,__int64 const * __ptr64,__int64 const * __ptr64) 1> c:\program files (x86 )\Microsoft Visual Studio 12.0\vc\include\xutility(2736) : 情報 C5002: 理由 '500' によりループがベクトル化されていません
単純な 10 行のコードに対して、文字通り何百もの同じ警告が表示されます。実際、#include "boost/multi_array.hpp" 以外のコードがない場合でも、C5002 情報を取得します。
私の懸念は、ベクトル化の失敗による効率の低下です。マルチアレイのベンチマークを行ったところ、実際、リリース モードであっても、ネイティブ アレイよりもはるかに遅く実行されます。ここを参照してください: Boost MultiArrays のパフォーマンスが悪い
マルチアレイの使用中にランタイム効率が低下しないように、コンパイラーを適切にベクトル化する方法があるかどうかを知りたいです。
c++ - boost::multi_array reshape() 関数の複雑さ
boost::multi_array
reshape() 関数の複雑さは? 私はそれが O(1) であることを期待していますが、ドキュメントでこの情報を見つけることができません。このライブラリのドキュメントは、実際にはかなり不足しています。
私が尋ねている理由は、単一のループを使用して multi_array オブジェクトを反復処理したいからです (配列インデックスは気にしません)。ライブラリは、単一の反復子を使用して配列を反復処理する方法を提供していないようです。したがって、回避策として、最初に単一の次元に沿って配列を再形成したいと思います (他の次元は 1 に設定)。次に、単一のループを使用して配列を反復処理できます。ただし、reshape()
操作がどれほど効率的かはわかりません。
したがって、私の 2 番目の質問:multi-array
単一のループを使用して、オブジェクトのすべての要素を反復処理する簡単な方法はありますか?