Домовладелец Отражение для QR-разложения - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь осуществить декомпозицию QR через отражатели домохозяина. При попытке сделать это на очень простом массиве я получаю странные числа. Любой, кто может сказать мне, также, почему использование оператора @ vs * между vec и vec.T в последней строке определения функции получает основные бонусные очки.

Это ставит в тупик две математические / компьютерные науки по состоянию на сегодняшнее утро.

    import numpy as np

    def householder(vec):
       vec[0] += np.sign(vec[0])*np.linalg.norm(vec)
       vec = vec/vec[0]
       gamma = 2/(np.linalg.norm(vec)**2)
       return np.identity(len(vec)) - gamma*(vec*vec.T)

    array = np.array([1, 3 ,4])
    Q = householder(array)
    print(Q@array)

Вывод:

   array([-4.06557377, -7.06557377, -6.06557377])

Где это должно быть:

   array([5.09, 0, 0])

1 Ответ

0 голосов
/ 08 октября 2019

* - поэлементное умножение, @ - матричное умножение. Оба имеют свое применение, но для матричных вычислений вы, скорее всего, захотите матричный продукт.

vec.T для массива возвращает тот же массив. Простой массив имеет только одно измерение, транспонировать нечего. vec*vec.T просто возвращает массив поэлементных квадратов.

Возможно, вы захотите использовать vec=vec.reshape(-1,1), чтобы получить правильный вектор столбца, матрицу из одного столбца. Тогда vec*vec.T делает "случайно" правильную вещь. В любом случае вы можете поместить туда оператор умножения матриц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...