Подтвердить что ты не робот

Изменение матрицы 3d на матрицу 2d

У меня есть 3D-матрица (n-by-m-by-t) в MATLAB, представляющая измерения n-by-m в сетке за определенный период времени. Я хотел бы иметь 2d-матрицу, где исчезла пространственная информация, и остались только n*m измерения с течением времени t (т.е.: n*m-by-t)

Как я могу это сделать?

4b9b3361

Ответ 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

Есть и другие превосходные инструменты, которые помогают манипулировать массивами.