2012-04-14 60 views
2

我使用一维矢量来表示一个三维数据结构,索引为0到x * y * z,其中x,y和z是每个方向上的单元格数量。一维矢量 - 三维指数

为了指数的特定细胞[XI] [易] [紫],我用:

index = xi + x*yi + x*y*zi ; 

我的问题是,我无法工作,如何走另一条路!

例如我想在指数43

表示的各个坐标,我想我已经摸索出如何获得十一:

xi = index % x ; 

,但我不能为我的生命得到了其他.. 。:/

编辑:嗯。这是正确的吗?

xi = index % x; 
yi = ((index - xi)/x) % y; 
zi = ((index - xi - x*yi)/x)/y ; 
+0

你的编辑是正确的,但是减法是因为整数除法 – SirGuy 2012-04-14 17:56:02

回答

4

试试这个:

xi = index % x; 
yi = (index/x) % y; 
zi = ((index/x)/y) % z; 

这可以很容易地推广正如人们所预料。

+0

'%z'是不必要的,但它清楚地显示了如何概括这一点。天堂禁止有人需要4,5或6维数组! – SirGuy 2012-04-14 18:02:23

+0

我听说“他们”在国际象棋程序中使用〜7维数组,所以谁知道;)我发现'%z'不坏,因为它允许自动循环数组索引,这可以派上用场。 – Anthales 2012-04-14 18:07:19

+0

我不确定我赞同循环数组索引,大部分时间(至少对我来说)如果我的索引大于我的数组,这是一个错误,但循环会隐藏这个索引。虽然在其他情况下,如果它很方便,那么它很方便,我会批准。 – SirGuy 2012-04-14 18:10:36

1

一些模块化算术应该做的伎俩。

index % x = (xi + x*yi + x*y*zi) % x = xi % x, 
    but 0 <= xi < x therefore xi % x = xi. 

然后,对于义:

(index/x) % y = yi. 

然后最后:

index/(x * y) = zi. 

编辑:

在代码(相对于上述数学)将是:

xi = index % x; 
    yi = (index/x) % y; 
    zi = index/(x * y); 
+0

很好的答案不必要的......因为这是一个编码的网站,也许至少使最后方程样子的东西,可能是代码? (我从来没有见过这样的任务操作员) – Shep 2012-04-14 17:56:59

+0

@Shep你是对的,我只是很享受数学问题,我忘记了一些细节。编辑答案 – SirGuy 2012-04-14 18:00:28