Как получить координату центра 1-мерного массива в 2-мерной матрице - PullRequest
4 голосов
/ 15 ноября 2011

Вот сценарий:

// getMatrix() returns int[]. It is 1-d
// I wish it was 2d.
int[] mat = MyMatrix.getMatrix();

// get height and width of the matrix;
int h = MyMatrix.height;
int w = MyMatrix.width;

// calculate the center index of the matrix
int c = ... // need help here

// manipulate the center element of the matrix.
SomeClass.foo(mat[c]);

Пример. Предположим, у меня есть матрица 5 x 5:

* * * * * // index 0 to 4
* * * * * // index 5 to 9
* * * * * // index 10 to 14.
* * * * * // index 15 to 19
* * * * * // index 20 to 24

Если бы getMatrix() вернул int[][], координата центра этой матрицы была бы (2,2) 0-index based. Но поскольку getMatrix() возвращает int[], индекс центральной координаты c равен 12.

Однако, если высота или ширина матрицы является четной, индекс центра может иметь один из 2 или 4 центров, как показано в матрице 6 x 6:

* * * * * *
* * * * * *
* * @ @ * *
* * @ @ * *
* * * * * *
* * * * * *

-> Центром является любой из @ выше.

Как рассчитать для индекса центра c матрицы m x n ?

1 Ответ

7 голосов
/ 15 ноября 2011

Центр матрицы является центром массива. Это потому, что будет одинаковое количество строк выше и ниже центральной строки. А в центральном ряду будет одинаковое количество ячеек слева и справа от центральной ячейки.

int c = mat.length / 2;

или, если хотите:

int c = (width * height) / 2;

Это предполагает, что существует единственный центр матрицы. То есть существует нечетное количество строк и столбцов.

Если вы хотите получить медиану (среднее для всех центров), она станет более сложной:

int x1 = (width - 1)/2;
int x2 = width/2;
int y1 = (height - 1)/2;
int y2 = height/2;
double median = (mat[width*y1 + x1] + mat[width*y1 + x2] +
                 mat[width*y2 + x1] + mat[width*y2 + x2])*0.25;

Если вам нужна только одна из центральных ячеек, выберите одну из четырех комбинаций x1, x2, y1, y2. Простейшим будет:

int c = width * (height / 2) + (width / 2); // lower right center
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...