【问题标题】:Why is 2D array accessor [Column][Row] and not [Row][Column] format? [closed]为什么二维数组访问器是 [Column][Row] 而不是 [Row][Column] 格式? [关闭]
【发布时间】:2017-05-24 15:17:13
【问题描述】:

这可能是一个愚蠢的问题,但我花了太长时间不知道原因。

在整个数学课中,我们都学会了以 (x, y) 的方式放置坐标。它深深地印在我们的脑海中。现在输入 C/C++ 并访问 x=0, y=3 元素,我必须使用 data[0][3] 而不是 data[3][0]

为什么数组访问是(y, x)格式而不是(x, y)

这是有什么特殊原因,还是我必须接受并继续我的生活?

编辑: 我正在观看 Mike Acton (http://gdcvault.com/play/1021866/Code-Clinic-2015-How-to) 的 GDC 演讲,他在其中谈到了有关行主要访问和列主要访问的性能。这是可以理解的,因为任何数组都是顺序内存,如果我尝试进行列主要访问,它需要时间跳转到不同的内存位置。

【问题讨论】:

  • 但是是行列格式...
  • 当您以行优先顺序存储数组时会发生这种情况。过去有很好的理由这样做,例如。在光栅显示器上显示图像。如果您认为自己真正需要,则无需停止以列优先顺序排列您自己的数组。
  • int array[HEIGHT][WIDTH] => array[y][x], int array[WIDTH][HEIGHT] => array[x][y]
  • 好吧,所以如果你明白他为什么这样做,并且你知道你可以做任何一个,那么究竟有什么不清楚?
  • ...因为您已经按照行优先顺序而不是列优先顺序创建了数组。如果您想要传统方式,请制作一个以列为主的数组。或者,或者,创建一个类来包装您的数组并提供方便的(x, y) 访问器(这是大多数人和图书馆最终所做的)。

标签: c++ arrays multidimensional-array


【解决方案1】:

当您查看使用数学的约定时,[row][col] 约定就产生了。考虑并从代数中订购对: (x, y) 其中 x 先出现。这在数学上是一致的,直到你一直到顺序突然改变的线性代数。在处理矩阵时,上下元素应该首先出现,如:M[row][col]。此约定用于线性代数中用于更高级别操作(如矩阵乘法......或将 3x3 矩阵乘以 3 向量(或 3x1 矩阵))中的恒定性。如果你把它想象成一个离散值的矩阵,而不是它产生的一个点。

【讨论】:

    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2018-01-31
    • 1970-01-01
    相关资源
    最近更新 更多