2013-10-19 137 views
0

好吧,我有一个数组A [4] [4],和另一个A [16],这两个都是彼此不同的表示。现在,我得到了二维数组上的元素位置,但我必须从1D数组中访问它。 IE,如果我被告知访问我的一维数组中的元素A [2] [0],我该怎么做?二维和一维阵列之间

回答

0

这取决于您的编程语言和阵列类型的选择。对于不同的语言,数组要么保存在row-major order or column-major顺序:


编辑:Java没有多维数组,按该documentation:在Java中,多维数组的结构数组的数组,即其元素是对数组对象的引用的数组。这意味着每行可以有不同的长度,因此存储格式既不是行大也不是列大。


行优先顺序在C/C++,PL/I,Python和Speakeasy的和其他人使用。列主要顺序用于Fortran,MATLAB,GNU Octave,R,Julia,Rasdaman和Scilab。

在一些语言中,你也可以选择顺序(如MATLAB)

对于row-major orderA[2][0]将在A[2*4+0](其中4是一个行的大小):

偏移=行* NUMCOLS +柱

对于column-major orderA[2][0]将处于A[0*4+2](其中4是一列的大小):

偏移=行+列* numRows行

这真的取决于你的编程语言!

+0

在java中这样做,所以行主要。我明白了,非常感谢! – rhl13

+0

你不能在Java中这样做,请参阅上面的更新答案。 – jmiserez

+0

在我看来,调用内存布局“row-major”或“column-major”[会导致混乱](http://stackoverflow.com/questions/17717600/confusion-between-c-and-opengl-matrix-order -row-major-vs-column-major/17718408#17718408),因为存储在数组“行”中的数据不一定代表行。 – SigTerm

0

在这个简单的例子中,A[2][0]映射到A[8],因为您正在请求第三组四个中的第一个元素。同样,A[0][2]映射到A[2],因为您正在请求第一组四个中的第三个元素。一般来说(A[i][j])您正在请求A的(i * 4 + j)个元素。

在更一般的情况下,您正在请求(i * width + j)个元素。