将行和列值转换为具有分组值

时间:2018-04-24 21:54:58

标签: arrays math

这种问题突然出现了,但是请耐心等待,它有一个转折点。

假设你有以下数组...

[A, B, C, D, E, F, G, H , I, J, K, L]

你映射到这样的网格

 | 0 1 2 3
 ----------
0| A D G J
1| B E H K
2| C F I L

如果需要找到网格中任何项目的原始数组索引,可以使用此公式(行和列基于零)。

col * numRows + row

所以“I”的索引位于网格上的坐标2,2上......

2 * 3 + 2 = 8

Simples!所以现在想象你有两个阵列......

[A, B, C, D, E, F, G, H , I, J, K, L]
[@, &, *, #, €, %, ƒ, œ, ≈, ∑, ß, Ω ]

这是在这样的网格中布局的......

   0 1 2 3 4 5 6 7
 -----------------
0| A @ D # G ƒ J ∑
1| B & E € H œ K ß
2| C * F % I ≈ L Ω

现在你需要约束列索引,以便0& 1 = 0,2& 3 = 1等等。为此,我想出了这个公式。

Math.floor(column / numArrays) * numRows + row;

现在让我们把它变成一个装备。想象一下,你有这两个阵列(每个16个项目)

[1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8]
[100,100,200,200,300,300,400,400,500,500,600,600,700,700,800,800]

但是现在,您希望网格显示已将值对相加的行

   0 1   2  3
----------------
0| 2 200 10 1000 
1| 4 400 12 1200
2| 6 600 14 1400
3| 8 800 16 1600

你想找到原始数组中的第一个索引,例如值8的索引将是15,或者值400的索引将是2.

我做了一个天真的假设,你可以将行和列索引乘以我用来对值进行求和的chunk size。然而,这是完全错误的。

那么,当网格由多个数组组成时,可以使用行和列索引在平面数组中派生索引,这些数组的值已经交错,并且总和(或者我称之为“折叠”)? / p>

更新:我取得了一些进展。如果我的第二个公式是函数

func coordsToIndex(col, row, totalDataSets, totalRows) {
  return Math.floor(col / totalDataSets) * totalRows + row;
}

如果变量chunkSize表示将多少个值一起求和,那么

coordsToIndex(col, row, totalDataSets, totalRows) * chunkSize

接近,但结果索引总是因块大小而过大。 SO!

(coordsToIndex(col, row, totalDataSets, totalRows) * chunkSize) - chunkSize

给我正确的值,但只有当chunkSize大于零时才会导致我...

index = (coordsToIndex(col, row, totalDataSets, totalRows) * chunkSize)
realIndex = chunkSize > 1 
  ? (index * chunkSize) - chunkSize 
  : calculatedIndex;

我觉得有一种更简洁的方法可以做到这一点,而且我错过了一些明显的东西。

0 个答案:

没有答案