Вы можете достичь того, что хотите, с помощью умного использования reshape
, как вы упомянули, а также индексирования.Кроме того, вам нужно будет использовать permute
(который меняет размеры), потому что вы хотите сохранить каждый «срез» нетронутым.
Прежде всего, полезно знать, что вы можете исключить свой 4-й срезиспользуя индексацию.Рассмотрим следующий пример:
A = randi(100,3,2,5)
idxdim3 = [1,2,3,5]; % Create an array of integers corresponding to the slices you want
B = A(:,:,idxdim3) % Extract all the slices you want, discarding the 4th
В этом случае у вас будет массив размером [3 x 2 x 4].Далее вы можете попробовать использовать reshape
, но у вас возникнет проблема.reshape
идет вверх по измерениям, столбцы - это первое измерение, строки - второе, а «кусочки» - третье.Как вы сказали, вы хотите держать столбцы в каждой строке по порядку, но reshape
изменит их до того, как начнет работу в третьем измерении.Таким образом, нам нужно сначала поменять местами второе и третье измерения, используя permute
:
% Leave 1 as the first dimension, but switches dimensions 2 and 3 around:
C = permute(B,[1 3 2]);
Теперь мы можем reshape
получить соответствующий размер:
D = reshape(C,[12 2 1]);
Что должно датьВы результат, который вы ищете.Конечно, мы можем объединить большинство этих операторов в одну строку, например так:
A = randi(100,3,2,5); % Put your data here instead
idxdim3 = [1,2,3,5];
B = reshape( permute( A(:,:,idxdim3), [1 3 2]), 12, 2);
Примечание: если вы будете работать с A
другого размера, вы можете позволить reshape
вычислите одно из измерений, если указать другие.Также будет работать следующее:
B = reshape( permute( A(:,:,idxdim3), [1 3 2]), [], 2);
reshape
рассчитает для вас 12
.
Пример вывода:
A(:,:,1) =
44 80
39 19
77 49
A(:,:,2) =
45 76
65 28
71 68
A(:,:,3) =
66 50
17 96
12 35
A(:,:,4) =
59 26
23 51
76 70
A(:,:,5) =
90 14
96 15
55 26
B =
44 80
39 19
77 49
45 76
65 28
71 68
66 50
17 96
12 35
90 14
96 15
55 26