Какую математическую функцию выполняет изменение формы? - PullRequest
0 голосов
/ 08 апреля 2019

В Python и MATLAB вы можете использовать функцию reshape() для изменения размеров матрицы.

Что это за операция в линейной алгебре, это смена базиса или более простое умножение матриц или ничего из этого?

Ответы [ 2 ]

3 голосов
/ 08 апреля 2019

Эта функция не имеет ничего общего с линейной алгеброй, это простой трюк с индексированием.Рассмотрим следующее (я буду использовать синтаксис 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), поскольку его внешний вид изменился.

1 голос
/ 08 апреля 2019

В соответствии с документацией Python 1 , 2 , он просто перемещает массив (так что делает линейный 1-D вектор. Затем, используя индексирование, возвращается в новый массив определенного размера, например:

start_array = 
[1,2,3,4;
5,6,7,8;
9,10,11,12]

i_a = [1,2,3,4,5,6,7,8,9,10,11,12] %implicit, not visible for user

result_array = 
[i_a(1), i_a(6), i_a(11); 
i_a(5), i_a(10), i_a(4); 
i_a(9), i_a(3), i_a(8); 
i_a(2), i_a(7), i_a(12)]
...