Измените 3d матрицу на 2d матрицу
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(:,:)
сжать последние два измерения, но изменить форму быстрее.
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Вопросы из категории :
- matlab Каковы эффективные способы объединения двух структур в MATLAB?
- matlab Можно ли выполнять параллельные обходы в MATLAB так же, как в Python?
- matlab Каков самый простой способ экспортировать данные Excel в Matlab?
- matlab Как работают свойства в объектно-ориентированном MATLAB?
- matlab Как нарисовать график поверхности без черных краев в MATLAB?
- matlab Как я могу сохранить измененное изображение в MATLAB?
- matrix Функция транспонирования / распаковки (обратная сторона zip)?
- matrix Как вы вращаете двумерный массив?
- matrix Как мне перебрать каждый элемент в n-мерной матрице в MATLAB?
- matrix Компактная матричная индексация MATLAB
- matrix How do I resize a matrix in MATLAB?
- matrix Простой обратный код матрицы 3х3 (C ++)
- reshape Преобразование данных из многих строк во многие столбцы
- reshape Изменение формы data.frame из широкого в длинный формат
- reshape Измените 3d матрицу на 2d матрицу
- reshape Как изменить данные из длинного в широкий формат
- reshape Измените три столбца данных кадра в матрицу ("длинный" в "широкий" формат)