Как изменить несколько измерений с ограничениями - PullRequest
0 голосов
/ 19 сентября 2018

Я пытался добиться этого поведения с помощью изменения формы.Я новичок в Matlab, поэтому я немного боролся.

У меня есть матрица

3 x 2 x 5 под названием A

И я хотел бы объединитьразмеры от 1 до 5, исключая 4. При их объединении я хочу сохранить столбцы в каждой строке по порядку.

Я знаю, что могу сделать что-то вроде

A = изменить (A, [12, 2, 1]), но меня беспокоит то, что это может не сохранить порядок столбцов в каждой строке, и это не позволяет мне исключить измерение.

Пример:

(:,:,1) =

0.3168    3.1825
1.5841    1.5766
-0.7892    3.0073


(:,:,2) =

-0.2131    3.9708
2.9435    0.4964
-0.2131    2.5985

(:,:,3) =

0.5012    -3.5328
0.4551    2.1314
-1.5956    3.4161

(:,:,4) =

-0.12    -3.28
-0.51    -2.14
-1.56    -3.61


(:,:,5) =

6.5012    3.538
0.4551    0.314
-0.5956    0.411

Вывод, скажем, объединение всех измерений, кроме 4-го

0.3168    3.1825
1.5841    1.5766
-0.7892    3.0073
-0.2131    3.9708
2.9435    0.4964
-0.2131    2.5985
0.5012    -3.5328
0.4551    2.1314
-1.5956    3.4161
6.5012    3.538
0.4551    0.314
-0.5956    0.411

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Вам необходимо использовать комбинацию permute и reshape:

% delete A[:,:,4]
B = A(:,:,[1:3,5])
% permute dimension 2 and 3, because you want to concatenate your array according to the 3nd dimension before the 2nd dimension.
C = permute(B,[1 3 2])
% Use reshape with the first parameter beeing '[]' so matlab will automatically compute the number of line needed, the number of column is fixed: it's 2 or size(B,2)
C = reshape(C,[],size(B,2))
0 голосов
/ 19 сентября 2018

Вы можете достичь того, что хотите, с помощью умного использования 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...