#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 Спасибо за это 🙂