2013-07-08 35 views
0

我在MATLAB中构建了交替数字树算法,但由于速度太慢,我正在用C++重写程序。如何正确引用2D数组?

在某个阶段必须选择搜索哪棵树。根据三个值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; 

我知道数组是通过引用传递当传递给一个函数,但我无法掌握二维数组的工作方式。希望你能帮我!

问候,

恩斯特·扬

+0

使用'std :: vector'并忘记原始数组 –

+0

@TonyTheLion我认为向量是为了方便内存管理,并且似乎比标准数组慢。这些二维数组中的元素必须被访问数十亿次,使用向量时是否会有重大性能损失? – EJG89

+0

@ EJG89:不,完全没有损失。为什么会有?你有没有简介过它? – Puppy

回答

0

你可以做到这一点如果您在您的参数列表中的第二阵列尺寸的大小,即:

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向量。你可以很容易地将一个矢量嵌入另一个矢量。

+0

我确实想知道这是否可能,但我尝试过,确实没有任何问题!我只是想出了自己的想法,但我认为你的解决方案最适合这个问题。 由于数组只能通过存储在它们自己内部的索引(包含子元素的搜索树)访问,所以有关变化维数的信息已经隐式存储并传递给函数。 – EJG89

0

我认为你必须使用double *引用这些阵列。但与double *,您不能使用[][]检索数组元素。幸运的是,这些数组的第二维都是17,所以你可以引用元素nodes[x * 17 + y]

+0

@Even Li所以我的数组是二维的,但是当使用指针引用它时,它退化为指向double的指针数组仍然是结构化的,因此您可以通过它们的线性索引而不是它们的x,y索引访问元素? – EJG89

+1

在c中,不管数组的维数是多少,它只是一个线性内存块。 – TieDad