Смена базы в NumPy - PullRequest
       41

Смена базы в NumPy

0 голосов
/ 10 марта 2019

Учитывая две базовые матрицы basis_old и basis_new в numpy, есть ли где-нибудь в библиотеке функция для получения матрицы преобразования для преобразования вектора vec в basis_old в его представление в basis_new?

Например, если у меня есть вектор vec = [1,2,3] в стандартной базе [1,0,0], [0,1,0], [0,0,1], как мне преобразовать его в другую базу, скажем,

e1 = [1 0 0]
e2 = [0 0 1]
e3 = [0 1 0]
basis_new = np.array([e1, e2, e3])

# I want something like this
vec_new = np.linalg.change_of_basis(vec_old, basis_old, basis_new)

# Or this:
transformation_matrix = np.linalg.basis_change(basis_old, basis_new)

Редактировать: изменено базисное_новое, чтобы оно стало линейно независимым

1 Ответ

2 голосов
/ 10 марта 2019

Помните, что означает, что набор векторов w1, w2, w3 является базисом R3.

  1. Значение w должно быть линейно независимым .Это означает, что единственным решением для x1 w1 + x2 w2 + x3 w3 = 0 должно быть x1 = x2 = x3 = 0. Но в вашем случае вы можете убедиться, что x1 = 1, x2 = -2, x3 = 1 - другое решение,Таким образом, ваш basis_new недействителен.

  2. Матрица W = [w1, w2, w3] должна быть обратимой.

  3. Для каждогоvector в R3 должен существовать уникальный способ записать его в виде линейной комбинации w.

Как только вы соберете эти требования для основы, вы можетевычислить новые координаты простым матричным умножением.Предположим, вы хотите выразить вектор v как v = c1 w1 + c2 w2 + c3 w3.Чтобы записать это в матричной форме, v = W c.Чтобы получить c, все, что вам нужно сделать, это умножить обе стороны на обратную W.

c = W ^ {- 1} v

В numpy вы бы написали это как,

vec_new = np.linalg.inv(np.array([w1, w2, w3])).dot(vec_old)
...