如何使用std::valarray
存储/操作2D数组?
我想看一个2D数组的例子,其中的元素由行/列索引访问。像这样的伪代码:
matrix(i,j) = 42;
如何初始化这样一个数组的例子也不错。
我已经知道Boost.MultiArray,Boost.uBlas和Blitz ++。
随意回答为什么我不应该使用valarray作为我的用例。但是,我希望多维数组的内存是连续的(列x行)块。没有Java风格的嵌套数组。
答案 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_array
,std::gslice_array
,std::mask_array
和std::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;}
};