Превращение матрицы в вектор - PullRequest
1 голос
/ 27 апреля 2020

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

Предположим, у вас есть N x N сетка или матрица. Если вы хотите как-то «растянуть», превратив его в массив сортов, чтобы теперь каждый элемент находился справа или слева друг от друга, как в векторе. Но вы хотели бы продолжать ссылаться на каждый элемент по его исходной ссылке - это строка и столбец. Что бы вы сделали, это поделите его индекс в векторе на N. Его строка будет индексом // N и столбцом, индексом% N.

Мой вопрос: что если бы сетка была N * 1012? * x M , в результате чего получается массив размером N * M, как бы вы получили соответствующую позицию каждого элемента в сетке?

Ответы [ 3 ]

3 голосов
/ 27 апреля 2020

Это «растяжение» называется уплощением. Это почти всегда делается в мажорном или столбцовом порядке. Основной ряд также известен как стиль C, где основной столбец известен как стиль Фортран.

enter image description here

Предполагается, что вы используете порядок основных строк для выровнять матрицу M x N , где M - количество строк, а N - количество столбцов, для которых правильные выражения преобразования для основного порядка строк:

col = i % N
row = i / N
-----------
i = row*N + col

Для основного порядка столбцов они:

col = i / M
row = i % M
-----------
i = col*M + row

Оба предполагают индексирование на основе нуля для i, col и row, а также усеченное деление.

1 голос
/ 27 апреля 2020

Я предполагаю, что под «растяжкой» вы подразумеваете, что вы кладете строки рядом друг с другом, чтобы сформировать 1-й вектор, как в

для 3x4 матрицы

a00 a01 a02 a03
a10 a11 a12 a13
a20 a21 a22 a23

вас растяните его в 1-й вектор, например:

a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23

Теперь, получив k индекс в указанном выше векторе, как вы получите соответствующий (i,j) в сетке N x M?

Вы можете получить их по

i = k / M

j = k - i*M

, где M - количество столбцов

. Вы можете проверить:

для k = 7 (a13) => i = 7/4 = 1 и j = 7 - (1*4) = 3 => (1,3)

для k = 1 (a01) => i = 1/4 = 0 и j = 1 - 0*4 = 1 => (0,1)

для k = 9 (a21) => i = 9/4 = 2 и j = 9 - 2*4 = 1 => (2,1)

Пример кода в Java выглядит следующим образом:

private static void printPositions(int N, int M) {
    int count = 0;
    for ( int k = 0; k < N*M; k++ ) {
      int i = k/M;
      int j = k - i*M;
      System.out.print( "(" + i + ", " + j + ")" + " " );
      count++;
      if ( count == M ) {
        System.out.println();
        count = 0;
      }
    }
  }

И вывод для различных значений N и M:

printPositions(3, 4) : 
(0, 0) (0, 1) (0, 2) (0, 3) 
(1, 0) (1, 1) (1, 2) (1, 3) 
(2, 0) (2, 1) (2, 2) (2, 3) 

printPositions(4, 6) : 
(0, 0) (0, 1) (0, 2) (0, 3) (0, 4) (0, 5) 
(1, 0) (1, 1) (1, 2) (1, 3) (1, 4) (1, 5) 
(2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (2, 5) 
(3, 0) (3, 1) (3, 2) (3, 3) (3, 4) (3, 5)

printPositions(1, 5) :
(0, 0) (0, 1) (0, 2) (0, 3) (0, 4) 
0 голосов
/ 27 апреля 2020

Просто определите функцию отображения, которая занимает позицию в матрице NxM и преобразует ее в позицию в векторе:

MATRIX           CORRESPONDING VECTOR

  | 0 1
--|------            0 1 2 3 4 5
0 | 7 2             -------------
1 | 1 9       =>     7 2 1 9 5 6
2 | 5 6

Функция отображения может быть f(x, y) = y * N + x.

Example 1
        element 1 (position x = 0, y = 1)
        f(0, 1) = y * N + x = 1 * 2 + 0 = 2.
        1 should be in position 2 of the vector

Example 2
        element 6 (position x = 1, y = 2)
        f(0, 1) = y * N + x = 2 * 2 + 1 = 5.
        6 should be in position 5 of the vector
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...