問題タブ [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.
c++ - boost::multi_array ビューを反復処理する
boost::multi_array が提供するビュー機能の使用方法を理解したい。具体的には、初期マトリックスの特定のサブマトリックス (必ずしも連続的ではない) を表すビューのすべての要素を 1 つのループ内で反復処理できるようにしたいと考えています。提供されたイテレータは、私が望むことをしないようです (または何もコンパイルしません)。
次の例では、2x6 マトリックスがあり、その 2x4 サブマトリックスを取得したいので、それを印刷しようとすると、「BoosLion」を取得することが期待されます。実際、これは、次元ごとに繰り返す場合に当てはまります。しかし、単一の反復子で反復を実行しようとすると、プログラムはコンパイルされません。
単一のループだけで反復する方法を知っている人はいますか? ドキュメントを検索してみましたが、関連するものは見つかりませんでした。また、これを行うことができる別のライブラリを誰かが知っている場合は、お知らせください。
c++ - 並べ替え関数と再帰コンパレータを使用してブーストの multi_array を並べ替える
私はビッグデータに取り組んでおり、C++ でプログラミングしています。たとえば、[7 x 128^3 x 5 x 5] などのサイズの 4 次元配列を作成する必要があります。さまざまなプロパティの中間データ構造として、さらに多くの配列を作成する必要があります。多くの調査を行った後、最終的にデータ構造を実装するためにブーストの multi_array を選択しました。multi_array を選択した理由は 2 つあります。(1) 配列インデックスが範囲外などの例外を処理します。これは、デバッグにとって非常に重要です。(2) 高次元の配列を処理します (stl の多次元配列などの他のオプションには、3 次元以上の配列で多くの問題があります)。
問題例。
例を使って問題を説明すると簡単になります。たとえば、次の 3 次元配列があるとします。
column_1、column_2、column_3 の順に並べ替えが行われるように、これらの行を並べ替えたいと思います。並べ替えた後、私は持っています
column_1 がソートされていることがわかります。同じ column_1 を持つ 2 つの行ごとに、column_2 が並べ替えられます。
私が試したこと。
この問題は、通常の 3 次元配列で再帰的なコンパレーターを作成し、ライブラリーのソート関数 (コンパレーターを使用) を呼び出すことで解決できました。しかし、ブーストの multi_array に変更した後、問題を解決できませんでした。解決策を見つけることができなかったブーストのドキュメントをたくさん検索しました。ブースト multi_array をソートするための再帰的コンパレーターの書き方がわかりません。
質問。
multi_array をソートするための boost multi_array の再帰コンパレータの正確な動作構文を教えてもらえますか? コードでは、特定のコンパイラ/オペレーティング システムに依存する API を使用してはなりません。multi_array A の次元を n1 x n2 x ... x nd と仮定します。
ありがとう。
ヤックに返信します。
再帰コンパレータは次のようになります。
再帰コンパレータを使用する sort 関数は次のようになります。
多次元配列は次のようになります。
(他の多くのことをしようとするため) 面倒なので、各パラメーターが何を表しているかについての他の多くの詳細は含めていませんが、コアのアイデアは例で説明されているとおりです。
私がやりたいことは、以下で定義されているように、multi_array の再帰的コンパレーターを作成することです。
オブジェクトが multi_array の場合にコンパレータ関数に引数を渡す方法がわからないため、compareByID のようにコンパレータを単純に記述することはできません。
これは役に立ちますか?
sehe に返信します。
優れたソリューション。ありがとうございます。あなたはブーストと c++ の使い方が天才のようですね。それは完全に機能しました。スワップとコンパレータ機能に使用したアイデアは素晴らしいです。これらの関数呼び出し (lexicographical_compare() など) が存在することすら知りませんでした。どうもありがとう。
関連する質問が 2 つあります。
(1) たとえば、multi_array A をすべての次元で並べ替えます。同じスワップ/交換/変換を multi_array B に適用したいのですが、あなたが与えたアイデアでこれを行うことができますか?
別のカスタム ソーターを作成することで、この問題を解決できることを理解しています (スワップすると、A と B の両方でコンポーネントをスワップできます)。しかし、A をソートするために multi_array B を使用している場合、コンパレーターは multi_array B について何も知らないため、この問題をコンパレーターの概念で解決できるかどうか興味があります。この問題を解決するにはどうすればよいですか?
(2) my_comp にいくつかのオーバーロードされた関数が必要ですか? その目的のために、完全に汎用的な関数を 1 つ持つことはできませんか? (申し訳ありませんが、私は multi_array、sub_array の概念が初めてです)。
c++ - boost::multi_array のメモリ管理とスコープ
データを格納するために boost::multi_array を使用しています。さまざまな次元のデータのスライスを操作する必要があるため、ビューを使用してデータに関するすべての作業を行います。
私の質問は、boost::multi_array のメモリはどのように管理されているのですか?
特に、データのスライス (ビュー) のコピーを操作したいと考えています。したがって、私はこのようなことをしたいと思います:
コピー関数が戻ると、コピーを含む multi_array が範囲外になるため、これが間違っているかどうかを知りたいです。それとも、multi_array はスマート ポインターまたは参照カウントを使用して追跡するので問題ありませんか?
c++ - 矢印演算子とブースト複数配列反復子
ブーストマルチアレイ反復子に矢印演算子がありませんか? これがうまくいくと期待するのは間違っていますか?
c++ - 異なるサイズの boost::multi_arrays を使用して関数を呼び出すことはできますか?
多次元配列をファイル システムに書き込む関数を構築しようとしています。コンパクトに保つために、異なるサイズの multi_arrays に対して 1 つの関数を作成したいと思います。
boost::multi_array_base_type
これを達成するためのようなものはありますか、それとも他の方法はありますか?