将一维数据结构视为2D网格


48

我正在使用将2D图像表示为1D数组的本机类。例如,如果要更改一个像素,则现在需要如何从x,y坐标中导出索引。

因此,假设我们有一个array1d像这样的一维数组:

array1d = [ a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y ]

在我们的程序上下文中,array1d代表2D网格:

a b c d e
f g h i j
k l m n o
p q r s t
u v w x y

我们想要对以下内容执行操作array1d

  • 获取x,y坐标值(在本例中1,2l
  • 使用x,y,width,height1,2,2,2将给出[l, m, q, r])获取任何子网格
  • 将值设置为任意x,y坐标(等)

我们该怎么做?


在Matlab中,因此可能的数学类型(溢出到CS中)将一个矩阵转换为另一个矩阵(将1x12转换为2x6或将2x6转换为3x4)被称为“重塑” mathworks.com/help/matlab/ ref / reshape.html

@MichaelT:OP不会重塑网格。没有提及将5x5重塑为其他任何东西(无论如何这是没有意义的)。:)
IAbstract

@IAbstract这个问题虽然修订版1中

Answers:


86

2D / 1D-映射非常简单。给定x和y,以及2D数组大小width(用于x方向)和height(用于y方向),您可以通过以下方式计算i一维空间(从零开始)中的相应索引

i = x + width*y;

而反向操作是

x = i % width;    // % is the "modulo operator", the remainder of i / width;
y = i / width;    // where "/" is an integer division

您可以轻松地将此尺寸扩展到3个或更多尺寸。例如,对于尺寸为“宽度”,“高度”和“深度”的3D矩阵:

i = x + width*y + width*height*z;

并反向:

x = i % width;
y = (i / width)%height;
z = i / (width*height);

@awashburn是传统的实现方式,它甚至内置于静态2D数组的编译器中
棘手的问题2013年

@mtoast:我不这么认为,它只是基本的整数数学。
布朗

对于3D,此示例是错误的。计算中的单词深度应为高度。
jiggunjer 2015年

@jiggunjer:感谢您的更正,相应地更改了我的答案。
布朗

1
@makakas:这是留给读者的练习;-)。提示:您必须在正确的位置添加/减去下限作为偏移量。但是,在尝试此操作之前,请先自己弄清楚您要表示的两个数组是1D还是2D数组。
布朗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.