9

如何使用 astd::valarray来存储/操作二维数组?

我想看一个二维数组的示例,其中元素通过行/列索引访问。像这样的伪代码:

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_arraystd::mask_arraystd::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是有效的,但是对于valarray操作数,operator>()不会被成功实例化,因为complex没有任何排序操作符。—结束示例]

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

26.5.2 类模板 valarray

1 类模板 valarray 是一维智能数组,元素从零开始按顺序编号。它是一组有序值的数学概念的表示。更高维度的错觉可能是由计算索引的熟悉习语以及广义下标运算符提供的强大子集能力产生的。

并进一步:

26.5.2.3 valarray 元素访问

4 同样,表达式 &a[i] != &b[j] 对于任意两个数组 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 回答