我有一个浮点数组。由于我处理大数据> 10 GB我想分配一些空间 但是我如何编写和读取这些数据?我不得不说,我是一名matlab程序员,并且不知道如何在c ++中这样做。
// allocating space
float *buffnew = new float[size_x*size_y*size_z];
// write
**buffnew[x][y][z] = 1.1f;
// read
prediction = **buffnew[x][y][z];
这不起作用。我得到的错误是:
error: subscripted value is not an array, pointer, or vector
编辑:我只是看到了我的错误。我使用一维数组来分配(在堆上,因为大数据),然后使用3D来访问它。
答案 0 :(得分:4)
C ++没有为动态多维数组提供方便的语法。您已经分配了一维数组,因此您需要通过算术来访问它,例如:
buffnew[x*size_y*size_z + y*size_z + z] = 1.1f;
将数组包装在一个类中是有意义的,使用访问器函数来执行算术:
template <typename T>
class array3d {
public:
array3d(size_t x, size_t y, size_t z) : array(x*y*z) {}
T & operator()(size_t x, size_t y, size_t z) {
return array[x*size_y*size_z + y*size_z + z];
}
T const & operator()(size_t x, size_t y, size_t z) const {
return array[x*size_y*size_z + y*size_z + z];
}
private:
std::vector<T> array;
};
array3d<float> buffnew(size_x, size_y, size_z);
buffnew(x,y,z) = 1.1f;
prediction = buffnew(x,y,z);
通过使用std::vector
而不是邪恶的指针,该类是可复制的,并且会在销毁时自动释放内存。
答案 1 :(得分:2)
假设你有足够的ram,你可以使用向量
#include <vector>
std::vector<float> values;
values.resize(size_x * size_y * size_z);
values[z + y*size_z + x*size_y*size_z] = 1.1;
prediction = values[z + y*size_z + x*size_y*size_z];
一种完全不同的方法,它将提供一个很好的(x,y,z)接口,就是使用lambda函数和闭包。
#include <vector>
#include <functional>
template<typename T>
std::function<T&(std::size_t, std::size_t, std::size_t)>
vector3d(std::size_t size_x, std::size_t size_y, std::size_t size_z) {
std::vector<T> values(size_x*size_y*size_z);
return [values, size_x, size_y, size_z](std::size_t x, std::size_t y, std::size_t z) mutable -> T&
{
return values.at(z + y*size_z + x*size_y*size_z);
};
}
请注意,lambda按值捕获分配的向量。 然后可以像这样使用此功能
std::size_t size_x = 10, size_y = 20, size_z = 30;
auto array = vector3d<float>(size_x, size_y, size_z);
std::size_t x = 3, y = 3, z = 3;
f(x,y,z) = 12.12;
auto prediction = f(x,y,z);
答案 2 :(得分:0)
您无需使用
**buffnew[x][y][z]
从阅读类型来看,我认为你想要一个三维数组。为此,声明
float *buffnew = new float[size_x][size_y][size_z];
buffnew[x][y][z] = 1.1f; //write
prediction = buffnew[x][y][z]; //read
这是在C ++中完成的方式
答案 3 :(得分:0)
我认为这就是你想要的:
float *buffnew = new float[size_x][size_y][size_z];
buffnew[index1][index2][index3] = 1.1f;
[...]
prediction = buffnew[index1][index2][index3];
这是在C ++中处理三维数组的标准方法。
或者您可以使用std::vector
。
答案 4 :(得分:0)
您可以制作多维数组
float ***buffnew = new float**[size_x];
for(unsigned int i = 0; i < size_x; ++i) {
buffnew[i] = new float*[size_y];
for(unsigned int j = 0; j < size_y; ++j) {
buffnew[i][j] = new float[size_z];
}
}
或者制作一个包含所有元素的一维数组,但是你必须从实际的x
,y
和z
中计算出正确的索引。