三维数组

时间:2015-11-01 15:04:07

标签: arrays data-structures

我正在寻找公式来查找行主要和列主要的3-D数组中元素的内存位置。使用我的逻辑后,我最终得到以下公式。 说数组是A[L][M][N]

行主:Loc(A[i][j][k])=base+w(M*N(i-x)+N*(j-y)+(k-z))
列优先:Loc(A[i][j][k])=base+w(M*n(i-x)+M*(k-z)+(j-y))

其中x,y,z是第一(L)第二(M)和第三(N)指数的下限。 我尝试了这个公式并得到了正确的结果但是当我在书中的问题中应用这个公式时,答案就不一致了。请有人帮我解决这个问题。

3 个答案:

答案 0 :(得分:1)

----------
FORMULA

**Row Major and Column Major for 3-D Array:
**ROW MAJOR OF A[I, J, K]=B+W[(K-Ko)*RC+(I-Io)*C+(J-Jo)] 
COLUMN MAJOR OF A[I, J, K]=B+W[(K-Ko)*RC+(I-Io)+(J-Jo)*R]**


----------


WHERE:
R=ROW
C=Column
K=Weidth
Ko=Lower Bound of Width
Io=Lower Bound of Row
Jo=Lower Bound of Column**

答案 1 :(得分:0)

正确的是:

row-major:Loc(A[i][j][k])=base+w(N*(i-x)+(j-y)+M*N(k-z))
column-major:Loc(A[i][j][k])=base+w((i-x)+M*N(k-z)+M*(j-y))

答案 2 :(得分:0)

谢谢! @Vinay Yadav 发表评论。按照 Vinay 的建议,请访问链接以详细了解这一点:https://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays

记住这一点,你永远不会弄错:
行专业:字典序
专栏专业:词典编序

如果您不知道什么是Co-lexicographicalLexicographical:查看this 维基百科页面了解更多信息。让我为您突出重要的部分,请仔细阅读:

<块引用>

词典中的词(某种语言中使用的词集)有一个 字典和百科全书中使用的常规排序,即 取决于用于符号的字母表的基本顺序 建立单词。字典序是形式化的一种方式 给定基础符号顺序的词序。

形式概念以有限集 A 开始,通常称为 字母表,这是完全有序的。也就是说,对于任意两个符号 a 和 A 中的 b 不是相同的符号,a < b 或 b < a。

A 的词是来自 A 的有限符号序列,包括 长度为 1 的单词包含单个符号,长度为 2 的单词包含 2 符号,等等,甚至包括没有符号的空序列 varepsilon 根本。辞典 order 在所有这些有限词的集合上将词排序为 如下:

给定两个相同长度的不同单词,假设 a = a1a2...ak 和 b = b1b2...bk,两个单词的顺序取决于两个单词不同的第 i 个符号的字母顺序 (从词首开始数): a < b 当且仅当 ai < bi 按照字母表的基本顺序 A. 如果两个单词有 不同的长度,通常的字典顺序填充较短 一个带有“空白”(一种特殊符号,被视为小于 A) 的每个元素都放在最后,直到单词长度相同, 然后像前面的例子一样比较单词。

在此之后,您可以从上面提到的同一维基百科页面中了解 Co-Lexicographical Order。上面引用的部分直接取自上述维基百科页面的动机和定义标题部分。访问一次,您将更好地了解两者。

您只需要在数组中所有可能的 (foo1, foo2, foo3) 中找到 (i, j, k) 的词典和共词典位置您的A

foo1 -> L possibilities: [Lower Bound x, Upper Bound x + L - 1]  
foo2 -> M possibilities: [Lower Bound y, Upper Bound y + M - 1]  
foo3 -> N possibilities: [Lower Bound z, Upper Bound z + N - 1]  

基于这些知识,你会得到:
1)。 A[foo1][foo2][foo3] (foo1, foo2, foo3) 在 Row Major Order 或 Lexicographical 中出现在元素 A[i][j][k] (i, j, k) 之前的元素数订单是:
[ (i - x)*M*N + (j - y)*N + (k - z) ]

2)。列主要订单或 Co 中出现在元素 A[foo1][foo2][foo3] (i, j, k) 之前的元素数 A[i][j][k] (foo1, foo2, foo3) -字典序为:
[ (i - x) + (j - y)*L + (k - z)*L*M ]

现在,您可以进行剩下的计算,将您的 baseW 事物带入其中,以获得所需的最终答案。