Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/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++ 以精细间距存储大型三维栅格_C++_Templates_C++14 - Fatal编程技术网

C++ 以精细间距存储大型三维栅格

C++ 以精细间距存储大型三维栅格,c++,templates,c++14,C++,Templates,C++14,我正在创建一个大小为10001000的大型3D网格,但内存不足。我正在为网格向量使用3个循环来保存值 for (i=0; i<1000;i++) for (j=0; j<1000;j++) for (k=0; k<1000;k++) MyGrid[i][j][k] = Random_Number 如果我访问网格点i,j,k,那么如何从我的网格中读取p1,p2,p3等 我尝试使用boost,但即使使用小间距的boost,也存在一个问题 typedef boost::mult

我正在创建一个大小为10001000的大型3D网格,但内存不足。我正在为网格向量使用3个循环来保存值

for (i=0; i<1000;i++)
for (j=0; j<1000;j++)
for (k=0; k<1000;k++)
MyGrid[i][j][k] = Random_Number
如果我访问网格点i,j,k,那么如何从我的网格中读取p1,p2,p3等

我尝试使用boost,但即使使用小间距的boost,也存在一个问题

  typedef boost::multi_array<double, 3> array_type;
  typedef array_type::index index;
  array_type MyGrid(boost::extents[1000][1000][1000]);
typedef boost::multi_array_type;
typedef数组_type::index索引;
数组_类型MyGrid(boost::extensts[1000][1000][1000]);
和程序崩溃。。我想保存网格点信息,并在以后检索它,以便在网格内移动对象。将使用基于网格点值的简单插值检索对象位置。所以我的想法是,如果我知道我的移动物体在网格中i,j,k位置的值,那么我可以很容易地通过简单的插值确定我的移动物体在网格内任意点的值


谢谢大家。

您只是想在三维空间中放置三维对象吗?你为什么不直接存储你拥有的几个对象,以及它们的大小和位置呢?这将节省大量内存

例:

查看命中/未命中测试的列表会非常快

如果需要更好的分辨率-更细的间距-,使用
float
double
代替
int

如果主栅格有很多零值,另一种解决方案是让每个对象都拥有自己的“迷你”栅格

struct Object
{
   int x_, y_, z_;              // << object center.
   double grid_[21][21][21];    // << could be a vector<vector<vector<double>>>;

   double InfluenceAt(int x, int y, int z)
   {
       double result = 0;
       int lx = x - x_;         // compute local coordinates
       int ly = y - y_;
       int lz = z - z_;

       if (   (lx < 0 || 21 <= lx)
           || (ly < 0 || 21 <= ly)
           || (lz < 0 || 21 <= lz) )
       {
          return 0;
       }
       return grid_[lx][ly][lz];  
   }
};
struct对象
{

int x,y,z;//您只是想将三维对象放置在三维空间中吗?为什么不存储您拥有的几个对象及其大小和位置?这将节省大量内存

例:

查看命中/未命中测试的列表会非常快

如果需要更好的分辨率-更细的间距,请使用
float
double
而不是
int

如果主栅格有很多零值,另一种解决方案是让每个对象都拥有自己的“迷你”栅格

struct Object
{
   int x_, y_, z_;              // << object center.
   double grid_[21][21][21];    // << could be a vector<vector<vector<double>>>;

   double InfluenceAt(int x, int y, int z)
   {
       double result = 0;
       int lx = x - x_;         // compute local coordinates
       int ly = y - y_;
       int lz = z - z_;

       if (   (lx < 0 || 21 <= lx)
           || (ly < 0 || 21 <= ly)
           || (lz < 0 || 21 <= lz) )
       {
          return 0;
       }
       return grid_[lx][ly][lz];  
   }
};
struct对象
{

int x_uu,y_uu,z_u;//在我阅读了描述和您的评论之后,听起来您只是在尝试存储、检索或获取有关对象的空间信息。您是否考虑过一种更高效的数据结构,如?听起来您熟悉Boost,并且已经存在一种您可能可以使用的数据结构。

Af在我阅读了描述和您的评论之后,听起来您只是在尝试存储、检索或获取有关对象的空间信息。您是否考虑过一种更高效的数据结构,如?听起来您对Boost很熟悉,并且已经存在一种您可能可以使用的数据结构。

您是否可以尝试将您的问题变得更简单ar并为MyGrid更新的内容提供一些上下文。MyGrid是多维数据集角的值。但如果间距非常小,则我运行内存问题。例如,我的网格大小为10001000,间距为0.2,则我遇到了问题,如果为1,则工作正常。下次如果我想读取4,6,11的值,则可以查看MyGrid[4] [6][11]并打印其值..这是一种查找表稀疏数组?所以你的问题是“有没有有效的方法来存储网格值?”?那么你需要告诉我你对效率有什么要求,空间?速度?老实说,我还是不知道你在问什么。你有
1000^3
个数字要存储。但是你选择存储它们会占用相同的内存量,不管是1D、2D还是3D。你能试着把你的问题弄清楚一点吗nd为MyGrid更新的内容提供一些上下文。MyGrid是多维数据集一角的值。但如果间距很小,则我运行内存问题。例如,我的网格大小为10001000,间距为0.2,则我有麻烦,如果为1,则工作正常。下次如果我想读取4,6,11的值,则可以查看MyGrid[4][6] [11]并打印其值..这是一种查找表稀疏数组?所以你的问题是“有没有有效的方法来存储网格值?”所以你需要告诉我你对效率有什么要求,空间?速度?老实说,我还是不知道你在问什么。你有
1000^3
个数字要存储。但是你选择存储它们会占用相同的内存量,不管是1D、2D还是3D。我不熟悉R-tree,但会读ab说出来。你是对的,我想存储和检索网格点信息用于其他目的。我不熟悉R-tree,但会阅读相关内容。你是对的,我想存储和检索网格点信息用于其他目的。我想保存和检索网格点值,以便在网格内移动对象。因此,网格点值将用于interpola可以将网格目的和网格值读取为查找表。这就是我需要大网格的原因。如果您的大多数网格元素
为零
,则最好不要这样大的查找表。我希望保存和网格点值,以便在网格内移动对象。因此,网格点值将用于插值目的,网格值可以作为查找表阅读。这就是我需要一个大网格的原因。如果您的大多数网格元素都是
,那么您最好不要使用这样大的查找表。
struct Object
{
   int x_, y_, z_;              // << object center.
   double grid_[21][21][21];    // << could be a vector<vector<vector<double>>>;

   double InfluenceAt(int x, int y, int z)
   {
       double result = 0;
       int lx = x - x_;         // compute local coordinates
       int ly = y - y_;
       int lz = z - z_;

       if (   (lx < 0 || 21 <= lx)
           || (ly < 0 || 21 <= ly)
           || (lz < 0 || 21 <= lz) )
       {
          return 0;
       }
       return grid_[lx][ly][lz];  
   }
};