Линеаризация 5D-матрицы в Matlab

#matlab #matrix #reshape #dimensions

#matlab #матрица #изменить форму #размеры

Вопрос:

Скажем, у меня есть матрица A, определенная в MATLAB как:

 A = zeros(2,2,2,2,2);

A(1,1,1,1,1) = 1;
A(1,1,1,1,2) = 2;
A(1,1,1,2,1) = 3;
A(1,1,1,2,2) = 4;
A(1,1,2,1,1) = 5;
A(1,1,2,1,2) = 6;
A(1,1,2,2,1) = 7;
A(1,1,2,2,2) = 8;

A(1,2,1,1,1) = 9;
A(1,2,1,1,2) = 10;
A(1,2,1,2,1) = 11;
A(1,2,1,2,2) = 12;
A(1,2,2,1,1) = 13;
A(1,2,2,1,2) = 14;
A(1,2,2,2,1) = 15;
A(1,2,2,2,2) = 16;

A(2,1,1,1,1) = 17;
A(2,1,1,1,2) = 18;
A(2,1,1,2,1) = 19;
A(2,1,1,2,2) = 20;
A(2,1,2,1,1) = 21;
A(2,1,2,1,2) = 22;
A(2,1,2,2,1) = 23;
A(2,1,2,2,2) = 24;

A(2,2,1,1,1) = 25;
A(2,2,1,1,2) = 26;
A(2,2,1,2,1) = 27;
A(2,2,1,2,2) = 28;
A(2,2,2,1,1) = 29;
A(2,2,2,1,2) = 30;
A(2,2,2,2,1) = 31;
A(2,2,2,2,2) = 32;
  

Как я могу преобразовать эту матрицу в новую матрицу B, такую, чтобы матрица B была вектором, таким, что B = [1,2,3,4 … 32]?

Функция изменения формы не работает, и я не могу найти в Интернете ничего, что могло бы помочь.

Заранее спасибо!

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

1. Всегда ли значения в порядке возрастания?

2. 1 в основном для очень подходящих тегов

Ответ №1:

У вас есть размеры в обратном порядке, чтобы достичь того, чего вы хотите. Итак: просто переставьте размеры (с permute ), а затем линеаризуйте (с : ):

 B = permute(A, [5 4 3 2 1]);
B = B(:);
  

Если вы хотите, чтобы это было в одной строке, используйте reshape для линеаризации:

 B = reshape(permute(A, [5 4 3 2 1]), [],1);
  

Если вы определили (обратите внимание на изменение индексов)

 A(1,1,1,1,1) = 1;
A(2,1,1,1,1) = 2;
A(1,2,1,1,1) = 3;
A(2,2,1,1,1) = 4;
A(1,1,2,1,1) = 5;
A(2,1,2,1,1) = 6;
A(1,2,2,1,1) = 7;
A(2,2,2,1,1) = 8;
...
  

размеры будут в «правильном» порядке, и тогда вам не понадобится permute :

 B = A(:);
  

или

 B = reshape(A, [],1);    
  

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

1. Большое вам спасибо! Я бы поддержал вас, если бы у меня было достаточно репутации!

2. @rayryeng Спасибо за это 🙂