如何使用 astd::valarray
来存储/操作二维数组?
我想看一个二维数组的示例,其中元素通过行/列索引访问。像这样的伪代码:
matrix(i,j) = 42;
一个如何初始化这样一个数组的例子也很好。
我已经知道 Boost.MultiArray、Boost.uBlas 和 Blitz++。
随意回答为什么我不应该在我的用例中使用 valarray。但是,我希望多维数组的内存是一个连续的(列 x 行)块。没有 Java 风格的嵌套数组。
如何使用 astd::valarray
来存储/操作二维数组?
我想看一个二维数组的示例,其中元素通过行/列索引访问。像这样的伪代码:
matrix(i,j) = 42;
一个如何初始化这样一个数组的例子也很好。
我已经知道 Boost.MultiArray、Boost.uBlas 和 Blitz++。
随意回答为什么我不应该在我的用例中使用 valarray。但是,我希望多维数组的内存是一个连续的(列 x 行)块。没有 Java 风格的嵌套数组。
在我的头顶上:
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_array
、std::gslice_array
、std::mask_array
和std::indirect_array
。
#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>
:例如: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。此属性表示没有别名,并且可以通过优化编译器来发挥优势。
如果要测试多维数组是否为连续(列 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;}
};
这是一个包含一些矩阵操作的示例