如何使用std :: valarray存储/操作连续的2D数组?

时间:2010-02-02 20:58:00

标签: c++ multidimensional-array c++-standard-library

如何使用std::valarray存储/操作2D数组?

我想看一个2D数组的例子,其中的元素由行/列索引访问。像这样的伪代码:

matrix(i,j) = 42;

如何初始化这样一个数组的例子也不错。

我已经知道Boost.MultiArray,Boost.uBlas和Blitz ++。

随意回答为什么我不应该使用valarray作为我的用例。但是,我希望多维数组的内存是连续的(列x行)块。没有Java风格的嵌套数组。

4 个答案:

答案 0 :(得分: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_arraystd::mask_arraystd::indirect_array

答案 1 :(得分: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访问速度可能更快
  • 所有编译器都不支持(查看文档)/实施不当
  • 有关可用作valarray<T>参数的类型,请参阅26.1:E.g:
  

3此外,许多成员和相关人员   valarray的功能可以   成功实例化并将   如果和,则表现出明确的行为   只有当T满足额外的时候   为每个这样的要求   会员或相关职能。

     

4 [   示例:实例化是有效的   valarray,但运算符&gt;()   将无法成功实例化   对于valarray操作数,因为   复杂没有任何排序   运营商。 - 例子]

编辑#2:标准保证vector与数组一样,总是使用连续的内存。此外,我们有:

  

26.5.2班级模板valarray

     

1类模板valarray是一个   一维智能阵列,用   元素顺序编号   零。它代表了   有序集的数学概念   价值观更高的错觉   维度可以由...产生   熟悉的计算指数成语,   与强大的一起   子集化功能   广义下标算子。

并进一步:

  

26.5.2.3 valarray元素访问

     

4同样,表达式&amp; a [i]!=   &amp; b [j]对任何两个都评估为真   数组a和b以及任何size_t i   和size_t j使得我小于   a和j的长度小于   b的长度。此属性表示   没有混叠,可以使用   通过优化编译器来获得优势。

答案 2 :(得分:0)

Here's一个包含一些矩阵操作的例子

答案 3 :(得分: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;}
};