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

matlab matrix reshape

56388 просмотра

3 ответа

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

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

Автор: Peter Smit Источник Размещён: 12.11.2019 09:06

Ответы (3)


28 плюса

Решение

Вам нужна команда 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(:,:)сжать последние два измерения, но изменить форму быстрее.

Автор: Ramashalanka Размещён: 13.02.2010 08:45

11 плюса

Reshape, конечно, является стандартным решением для изменения формы массива. (Как еще они это назовут?) Есть еще несколько хитростей, которые нужно раскрыть.

Прежде всего, самый простой способ превратить массив размера [n, m, p] в массив размера [n * m, p]?

B = reshape(A,n*m,p);

Но лучше это:

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

Если вы оставите один из аргументов для изменения формы пустым, то изменение формы вычислит для вас размер! Будьте осторожны, если вы попробуете это и размер А не будет соответствовать, то вы получите ошибку. Таким образом:

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);
Автор: user85109 Размещён: 13.02.2010 01:33

1 плюс

Лучшее решение этой проблемы - использовать nshape.m, доступный в N-Way Toolbox от Rasmus Bro. Это позволит вам изменить форму в данном режиме, что немного сложнее с командой reshape.

Набор инструментов доступен по следующей ссылке:

https://www.mathworks.com/matlabcentral/fileexchange/1088-the-n-way-toolbox

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

Автор: user3014616 Размещён: 20.11.2013 07:08
Вопросы из категории :
32x32