MATLAB — объединение 3-го измерения матрицы

#matlab #image-processing #matrix

#matlab #обработка изображений #матрица

Вопрос:

У меня есть 3D-матрица размером KxNxZ. Я хотел бы объединить подматрицы в 3-м измерении в единую 2D-матрицу размером K * ZxN, s.t. они будут объединены по строкам. Каков наилучший способ достижения этого результата?

Спасибо!

Пример:

 %generates input
M = cat(3,[(1:3)',(4:6)'],[(7:9)',(10:12)'],[(13:15)',(16:18)']);
DesiredOutput = [[(1:3)';(7:9)';(13:15)'],[(4:6)';(10:12)';(16:18)']];
  

Входная матрица

 M(:,:,1) =
 1     4
 2     5
 3     6

M(:,:,2) =
 7    10
 8    11
 9    12

M(:,:,3) =
13    16
14    17
15    18
  

Желаемая выходная матрица:

 DesiredOutput =

 1     4
 2     5
 3     6
 7    10
 8    11
 9    12
13    16
14    17
15    18
  

Комментарии:

1. Я предлагаю вам взглянуть на функции reshape и permute и немного поиграть с ними. Вы должны быть в состоянии получить результат, который вы ищете 🙂

Ответ №1:

Eskapp находится на правильном пути. Сначала используйте permute для замены второго и третьего измерений, чтобы получить K x Z x N матрицу. Как только вы это сделаете, вы можете использовать reshape для развертывания матрицы так, чтобы вы брали каждый 2D-фрагмент размером K x Z и преобразовывали это в один столбец, при этом каждый столбец 2D-фрагмента становится развернутым. К счастью, именно так работает MATLAB при изменении формы матриц, поэтому, естественно, это потребует очень мало усилий. Затем вы должны объединить все эти столбцы вместе, чтобы создать свою матрицу.

Вы впервые используете permute этот способ:

 Mp = permute(M, [1 3 2]);
  

Это говорит нам о том, что вы хотите поменять местами второе и третье измерения. Затем используйте reshape для этой матрицы, чтобы убедиться, что в каждом столбце есть K x Z элементы, где каждый столбец 2D-среза развернут в один столбец.

 DesiredOutput = reshape(Mp, [], size(M,2));
  

size(M,2) обращается к значению N в исходной матрице. Таким образом, вы хотите, чтобы у вас DesiredOutput были K*Z строки и N столбцы. Выполнение [] автоматически определяет, сколько строк у нас есть для выходной матрицы, чтобы упростить задачу.

Таким образом, мы получаем:

 >> DesiredOutput

DesiredOutput =

     1     4
     2     5
     3     6
     7    10
     8    11
     9    12
    13    16
    14    17
    15    18
  

Мы можем объединить все в один оператор следующим образом, если вы не хотите использовать временную переменную.

 DesiredOutput = reshape(permute(M, [1 3 2]), [], size(M,2));
  

В первую очередь я использовал временную переменную для объяснения каждого шага процесса.