#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));
В первую очередь я использовал временную переменную для объяснения каждого шага процесса.