У меня есть 3-я матрица (n-by-m-by-t
) в представлении MATLAB n-by-m
измерения в сетке в течение времени. Я хотел бы иметь 2-ю матрицу, где пространственная информация не стала и только n*m
измерения со временем t
оставлены (т.е.: n*m-by-t
)
Как я могу сделать это?
Вам нужна команда reshape
:
Допустим, ваша исходная матрица (только для меня, чтобы получить некоторые данные):
a=rand(4,6,8);
Затем, если последние две координаты являются пространственными (время 4, m равно 6, n равно 8), вы используете:
a=reshape(a,[4 48]);
и в итоге получаете массив 4x48.
Если первые два являются пространственными, а последний - временем (m = 4, n = 6, time = 8), вы используете:
a=reshape(a,[24 8]);
и в итоге получаете массив 24x8.
Это быстрая операция O (1) (она просто корректирует заголовок в зависимости от формы данных). Есть и другие способы сделать это, например a = a (:,:)
, чтобы сжать последние два измерения, но изменение формы происходит быстрее.
Изменение формы, конечно же, стандартное решение для изменения формы массива. (Как бы еще они это назвали?) Еще предстоит раскрыть несколько уловок.
Прежде всего, самый простой способ превратить массив размера [n, m, p] в массив размера [n * m, p]?
B = reshape(A,n*m,p);
Но лучше это:
B = reshape(A,[],p);
Если вы оставите один из аргументов reshape пустой, затем reshape вычисляет размер за вас! Будьте осторожны, если вы попробуете это, и размер 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);