Преобразование значений строк и столбцов в индексы для нескольких массивов со сгруппированными значениями - PullRequest
0 голосов
/ 25 апреля 2018

Этот тип вопросов так часто всплывает, но терпите меня, у него есть поворот.

Допустим, у вас есть следующий массив ...

[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, который я использовал для суммирования значений. Это, однако, совершенно неправильно.

Итак, возможно ли получить индекс в виде плоского массива, используя индексы строк и столбцов, когда сетка состоит из нескольких массивов, значения которых были чередованы и суммированы (или, как я это называю, «свернут»)?

ОБНОВЛЕНИЕ: я немного продвинулся. Если бы моей второй формулой была функция

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

И если переменная chunkSize указывает, сколько значений суммируется вместе, то это

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

Подходит близко, но результирующий индекс всегда слишком велик по размеру куска. ТАК!

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

Дает мне правильное значение, НО только когда chunkSize больше нуля, что приводит меня к ...

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

Я чувствую, что есть более аккуратный способ сделать это и что я упускаю что-то явно очевидное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...