【问题标题】:How to properly reference to 2D arrays?如何正确引用二维数组?
【发布时间】:2013-07-08 13:31:35
【问题描述】:

我在 MATLAB 中构建了一个交替数字树算法,但由于它太慢,我正在用 C++ 重写程序。

在某个阶段,必须选择搜索哪棵树。根据 x、y 和 z 这三个值,必须搜索三分之二的树(存储为二维数组)。有没有办法引用一个二维数组,以便稍后在搜索功能中使用它?

伪代码示例:

double nodes1[12567][17];
double nodes2[8467][17];
double nodes3[11245][17];

fillMatrices(nodes1,nodes2,nodes3); // Here the matrices are filled with numbers from txt files.

if(condition1) // Based on x,y,z
{
    nodes=nodes1;
}
elseif(condition2) // Based on x,y,z
{
    nodes=nodes2;
}
else
{
    nodes=nodes3;
}

searchTree(nodes,x,y,z); // Function call with variable 2d array nodes

我希望这个问题有点清楚。我对 C++ 还很陌生,是的,由于 MATLAB,我确实很难停止思考矩阵;)

我尝试了以下可能性:

double nodes[][] = nodes1[][];
double * nodes[] = nodes1[][17];
double nodes = &nodes1;

我知道数组在传递给函数时是通过引用方式传递的,但我无法理解二维数组的工作原理。希望你能帮助我!

问候,

恩斯特·扬

【问题讨论】:

  • 使用 std::vector 并忘记原始数组
  • @TonyTheLion 我认为向量是为了便于内存管理,并且似乎比标准数组慢。那些二维数组中的元素必须被访问数十亿次,使用向量时是否有任何重大的性能损失?
  • @EJG89:不,完全没有损失。为什么会有?你有没有分析过它?
  • @DeadMG 我只在 MATLAB 中对其进行了分析,其中 searchTree 函数被称为每个粒子 50k。请记住,目标是跟踪一百万个粒子(幸运的是在一个集群上)的性能是值得关注的。编辑:啊,我看到你不必每次调用都复制向量,但你可以引用它来节省开销?

标签: c++ reference multidimensional-array assign


【解决方案1】:

如果您在参数列表中包含第二个数组维度的大小,则可以这样做,即:

double nodes1[12567][17];
double nodes2[8467][17];
double nodes3[11245][17];

// note the array size declaration here:
void doSomething(double nodes[][17])
{
    //... access array "nodes" normally in here
}

int main()
{
    doSomething(nodes1);
    doSomething(nodes2);
    doSomething(nodes3);
}

这只是可能的,因为在每种情况下第二个维度的大小都相同。这为编译器提供了足够的信息来了解如何从一个元素偏移到下一个元素。

如果第二个维度也需要变化,我建议查看 STL 向量。您可以很容易地将一个向量嵌套在另一个向量中。

【讨论】:

  • 我确实想知道这是否可能,但我试过了,确实没有任何问题!我自己想通了,但我确实认为您的解决方案最适合这个问题。由于数组只能通过存储在自身内部的索引(包含子节点的搜索树)访问,因此有关可变维度的信息已经隐式存储并传递给函数。
【解决方案2】:

我认为您必须使用 double * 来引用这些数组。但是对于double *,您不能使用[][] 来检索数组元素。幸运的是,这些数组的第二维都是 17,因此您可以将元素引用为 nodes[x * 17 + y]

【讨论】:

  • @Even Li 所以我的数组是二维的,但是当使用指针引用它时,它会退化为指向仍然结构化的双精度指针数组,因此您可以通过它们的线性索引而不是它们的 x 来访问元素,y 指数?
  • 在c中,无论数组是什么维度的,都只是一块线性内存。
猜你喜欢
  • 2015-09-30
  • 2020-05-11
  • 2015-08-29
  • 2016-11-06
  • 2015-05-10
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
相关资源
最近更新 更多