Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用std::valarray存储/操作连续的二维数组?_C++_Multidimensional Array_C++ Standard Library - Fatal编程技术网

C++ 如何使用std::valarray存储/操作连续的二维数组?

C++ 如何使用std::valarray存储/操作连续的二维数组?,c++,multidimensional-array,c++-standard-library,C++,Multidimensional Array,C++ Standard Library,如何使用std::valarray存储/操作2D数组 我想看一个2D数组的示例,其中的元素通过行/列索引访问。类似于以下伪代码: matrix(i,j) = 42; 一个如何初始化这样一个数组的例子也很好 我已经知道Boost.MultiArray、Boost.uBlas和Blitz++ 请随意回答为什么我不应该在我的用例中使用valarray。但是,我希望多维数组的内存是连续的(列x行)块。没有Java风格的嵌套数组。一个包含一些矩阵操作的示例\include #include <io

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

我想看一个2D数组的示例,其中的元素通过行/列索引访问。类似于以下伪代码:

matrix(i,j) = 42;
一个如何初始化这样一个数组的例子也很好

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

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

一个包含一些矩阵操作的示例

\include
#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;
}
#包括 使用名称空间std; va2d型阵列; int main() { int data[][3]={{1,2,3},{4,5,6}; va2d垫(valarray(3),2); 对于(int i=0;i<2;++i) { 对于(int j=0;j<3;++j) mat[i][j]=数据[i][j]; } 对于(int i=0;i<2;++i) 对于(int j=0;j<3;++j)
从我头上往下看:

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;
};
模板
类矩阵
{
公众:
矩阵(尺寸宽度、尺寸高度):m_跨距(宽度)、m_高度(高度)、m_存储(宽度*高度){}
元素类型和运算符()(大小行、大小列)
{
//主修专栏
返回m_存储[std::slice(列、m_高度、m_跨距)][row];
//排大调
返回m_存储[std::slice(行、m_跨距、m_高度)][column];
}
私人:
std::valarray m_存储器;
步幅;
大小和高度;
};

std::valarray
提供了许多有趣的方法来通过切片、掩码、多维切片或间接表访问元素。有关详细信息,请参见
std::slice_数组
std::gslice_数组
std::mask_数组
std::indirect_数组

如果要测试多维数组,请参见
nal数组是一个连续的(列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;}
};
模板
类数组:public std::valarray{
行、列的大小;
公众:
数组(){}
数组(size_t nx):std::valarray(nx){row=nx,col=1;}
数组(size\t nx,size\t ny):std::valarray(nx*ny){row=nx,col=ny;}
虚拟~Array(){}
运算符((size_T i,size_T j){return(*this)[i*col+j];}

size_t size(size_t n)const{return(nWhy's want use valarray?我在任何地方都没有看到它被使用,只知道有反对它使用的论据。@gf:我对“dynamic”的boost很满意多维数组。但我在SO的其他地方偶然发现了valarray,并对它如何用于多维数组感到好奇。使用valarray的在线示例(特别是我的用例)似乎很稀少。@GeorgFritzsche反对使用它的理由是什么?你能至少提供一个简短的例子来解决这个问题吗?外部站点可能会在某个时候出现问题。在这个例子中,我似乎找不到2D
valarray
部分,但2D矩阵变平了。我认为OP想要一个
valarray
thingy。@直接:我希望数组内存是连续的,所以没有valarray。编辑了question.Oops。对不起。没有足够快地澄清我的问题。+1。总之,
valarray
旨在包含多维数组而不嵌套。
valarray
应该只对不同类型的矩阵数组/数组是必需的nt sizes.DIRKGENTY在我澄清我想要连续内存之前回答了这个问题。不需要向下投票。从你发布的引用来看,我不清楚valarray数据是否保证是连续的。你能详细说明一下吗?在valarray中,类型T有一些限制(编译器没有强制执行).T不能是valarray,根据这一点啊,是的,谢谢。这就是我要找的。我特别喜欢你显示了行/列的主要访问。valarray数据是否保证像vector一样是连续的?来自MSDN:template类描述了一个对象,它控制一系列存储为数组d的类型元素设计用于执行高速数学运算,并针对计算性能进行了优化。因此,我假设是这样。@MSN您的计算程序中有一个错误,您有两个m_步幅。
m_步幅(宽度),m_步幅(高度)
@MSN:您使用的是哪种编译器/stdlib,
matrix::operator()
compiled?在我的gcc 4.4.5
slice_array
(由
valarray::operator[slice slc]
返回)副本上,似乎没有
操作符[]
。它也被阻塞了。