9

std::valarrayを使用して 2D 配列を保存/操作するにはどうすればよいですか?

行/列インデックスによってアクセスされる要素を持つ 2D 配列の例を見たいと思います。この擬似コードのようなもの:

matrix(i,j) = 42;

そのような配列を初期化する方法の例もいいでしょう。

Boost.MultiArray、Boost.uBlas、および Blitz++ については既に認識しています。

私のユースケースで valarray を使用すべきではない理由を自由に答えてください。ただし、多次元配列のメモリを連続した (列 x 行) ブロックにする必要があります。Java スタイルのネストされた配列はありません。

4

4 に答える 4

12

私の頭の上から:

template <class element_type>
class matrix
{
public:
    matrix(size_t width, size_t height): m_stride(width), m_height(height), m_storage(width*height) {  }

    element_type &operator()(size_t row, size_t column)
    {
        // column major
        return m_storage[std::slice(column, m_height, m_stride)][row];

        // row major
        return m_storage[std::slice(row, m_stride, m_height)][column];
    }

private:
    std::valarray<element_type> m_storage;
    size_t m_stride;
    size_t m_height;
};

std::valarrayは、スライス、マスク、多次元スライス、または間接テーブルを介して、要素にアクセスする興味深い方法を多数提供します。詳細についてstd::slice_arraystd::gslice_array、、、、std::mask_arrayおよびstd::indirect_arrayを参照してください。

于 2010-02-02T21:54:15.637 に答える
5
#include <iostream>
#include <valarray>

using namespace std;

typedef valarray<valarray<int> > va2d;

int main()
{
    int data[][3] = { {1, 2, 3}, {4, 5, 6} };
    va2d mat(valarray<int>(3), 2);
    for (int i = 0; i < 2; ++i)
    {
        for (int j = 0; j < 3; ++j)
           mat[ i ][ j ] = data[ i ][ j ];
    }
    for (int i = 0; i < 2; ++i)
        for (int j = 0; j < 3; ++j)
           cout << mat[ i ][ j ] << endl;
}

詳細valarray

  • 数値計算用に最適化されています。
  • これは、vectorスライスとダイシングのための特別なメンバー関数を備えたライク コンテナーです。
  • イテレータなし
  • ベクター マシン用に設計されており、現在のマシンではパフォーマンスが低い:vectorアクセスが高速になる可能性がある
  • すべてのコンパイラでサポートされているわけではありません (ドキュメントを確認してください) / 実装が不十分
  • へのパラメーターとして使用できるタイプについては、26.1 を参照してくださいvalarray<T>

3 さらに、valarray の多くのメンバーおよび関連関数は正常にインスタンス化でき、T がそのようなメンバーまたは関連関数ごとに指定された追加要件を満たしている場合にのみ、明確に定義された動作を示します。

4 [ 例: valarray をインスタンス化することは有効ですが、complex には順序付け演算子がないため、valarray オペランドに対して operator>() は正常にインスタンス化されません。—終わりの例]

vector編集#2:配列と同様に、常に連続したメモリを使用するという標準的な保証。また、次のものがあります。

26.5.2 クラス テンプレート valarray

1 クラス テンプレート valarray は 1 次元のスマート配列で、要素には 0 から順に番号が付けられます。これは、順序付けられた一連の値の数学的概念を表したものです。より高い次元の錯覚は、一般化された添え字演算子によって提供される強力なサブセット化機能とともに、計算されたインデックスの使い慣れたイディオムによって生成される場合があります。

そしてさらに:

26.5.2.3 valarray 要素へのアクセス

4 同様に、式 &a[i] != &b[j] は、任意の 2 つの配列 a および b と、任意の size_t i および size_t j について、i が a の長さよりも小さく、j が長さよりも小さいと評価されます。 bの。このプロパティは、エイリアシングが存在しないことを示し、最適化コンパイラによって有利に使用される場合があります。

于 2010-02-02T21:47:17.773 に答える
0

多次元配列が連続した (列 x 行) ブロックであることをテストする場合。この例はvalarrayで見ることができます。

template<class T>
class Array: public std::valarray<T> {
  size_t row,col; 
public:
  Array(){}
  Array(size_t nx) : std::valarray<T>(nx){row=nx,col=1;}
  Array(size_t nx, size_t ny) : std::valarray<T>(nx*ny){row=nx,col=ny;}
  virtual ~Array(){}
  T& operator()(size_t i,size_t j) { return (*this)[i*col+j];}
  size_t Size(size_t n) const { return (n<2) ? col: row;}
};
于 2017-11-25T05:50:19.523 に答える
-1

これは、少しの行列操作を含む例です

于 2010-02-02T21:24:52.350 に答える