Эта функция не имеет ничего общего с линейной алгеброй, это простой трюк с индексированием.Рассмотрим следующее (я буду использовать синтаксис MATLAB , но в Python, особенно с использованием NumPy / SciPy , он будет функционировать одинаково):
A = [1 2 3; 4 5 6]; % 2-by-3 matrix
B = reshape(A,3,2); % B is 3-by-2
B =
1 5
4 3
2 6
Таким образом, на самом деле у вас есть 6 индексов в A
: от 1 до 6, в главном порядке столбцов.При изменении формы линейный стиль сохраняется, просто переупорядочивается.Линейно ваши элементы в порядке возрастания: 1 4 2 5 3 6
, которые хранятся в непрерывной памяти.В некотором роде «заголовок» сообщает программе, как формируются эти смежные элементы.Вот почему reshape
почти бесплатен: он только меняет заголовок.
Линейная алгебра не имеет к этому никакого отношения, это всего лишь численный прием, облегчающий выполнение определенных задач программирования.
Для получения дополнительной информации о том, как работает индексирование в MATLAB, я рекомендую этот замечательный Q / A .
Под капотом MATLAB преобразует A(2:2)
в A(4)
, то есть четвертый линейный индекс,используя sub2ind()
, именно потому, что все хранится в виде линейного вектора.Все, что нужно сделать, это сообщить заголовку, что элемент 3 больше не находится на A(1,2)
, а изменен на A(3,1)
, поскольку его внешний вид изменился.