Изменение матрицы 3d на матрицу 2d
У меня есть 3D-матрица (n-by-m-by-t
) в MATLAB, представляющая измерения n-by-m
в сетке за определенный период времени. Я хотел бы иметь 2d-матрицу, где исчезла пространственная информация, и остались только n*m
измерения с течением времени t
(т.е.: n*m-by-t
)
Как я могу это сделать?
Ответы
Ответ 1
Вам нужна команда reshape
:
Скажите, что ваша начальная матрица (просто для получения некоторых данных):
a=rand(4,6,8);
Затем, если последние две координаты являются пространственными (время равно 4, m равно 6, n равно 8), вы используете:
a=reshape(a,[4 48]);
и вы получите массив размером 4x48.
Если первые два являются пространственными, а последнее - временем (m равно 4, n - 6, время - 8), вы используете:
a=reshape(a,[24 8]);
и вы получите массив 24x8.
Это быстрая операция O (1) (она просто настраивает заголовок того, какова форма данных). Есть и другие способы сделать это, например. a=a(:,:)
для уплотнения последних двух измерений, но изменение формы выполняется быстрее.
Ответ 2
Reshape - это, конечно, стандартное решение для изменения массива. (Что еще они могли бы назвать?) Есть еще несколько трюков, чтобы раскрыть.
Прежде всего, самый простой способ превратить массив размера [n, m, p] в массив размера [n * m, p]?
B = reshape(A,n*m,p);
Но лучше это:
B = reshape(A,[],p);
Если вы оставите один из аргументов, чтобы изменить пустое, измените форму, чтобы вычислить размер для вас! Будьте осторожны, если вы попробуете это, и размер A не соответствует, тогда вы получите сообщение об ошибке. Таким образом:
reshape(magic(3),[],2)
??? Error using ==> reshape
Product of known dimensions, 2, not divisible into total number of elements, 9.
Логически мы не можем создать массив из двух столбцов из того, что содержит в нем 9 элементов. Я поместил функцию, называемую wreshape на центральном обмене MATLAB, который будет прокладывать по мере необходимости для выполнения этой операции без генерирования ошибок.
Конечно, вы всегда можете использовать трюки вроде
B = A(:);
чтобы создать вектор непосредственно из матрицы. Это эквивалентно форме
B=reshape(A,[],1);
Ответ 3
Лучшим решением этой проблемы является использование nshape.m в Rasmus Bro N-Way Toolbox. Это позволит вам переформатировать по заданному режиму, что немного сложнее с командой reshape.
Панель инструментов доступна по следующей ссылке:
https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox
Есть и другие превосходные инструменты, которые помогают манипулировать массивами.