Как написать al oop, используя концепцию формулы Gram_Schmidt, чтобы получить матрицу ортогонола? - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь написать al oop, который может выполнить logi c формулы в матрице "c" ниже, чтобы получить мой результат. У меня есть "a", которая является исходной матрицей данных, она количественная, и «b», который представляет коэффициент в формуле c. Матрица b имеет закономерность увеличения, например

  1. 1
  2. 12
  3. 123
  4. 1234
  5. 12345
a= [np.array([1,2,3]),np.array([4,5,6]),np.array([1,2,7]),np.array([4,2,7])]
b = [np.array([1]),np.array([1,2]),np.array([1,2,3])]
c = [
   a[0],
   a[1]-b[0][0]*a[0], 
   a[2]-b[1][0]*a[0]-b[1][1]*a[1],
   a[3]-b[2][0]*a[0]-b[2][1]*a[1]-b[2][2]*a[2]
    ]

Это вывод матрицы c (конечный результат, который мне нужно получить, но я хочу написать al oop, чтобы получить это)

 [array([1, 2, 3]),
 array([3, 3, 3]),
 array([ -8, -10,  -8]),
 array([ -8, -16, -29])]

Более того, я попытался написать l oop, чтобы получить результат, подобный:

for t in range(len(b)):
    for i in range(1,len(a)+1):
        a[i]-= b[t][i-1]*a[i-1]

, но он дал мне это сообщение об ошибке:

IndexError: index 1 is out of bounds for axis 0 with size 1

Итак, мне интересно, как это написать правильный l oop, чтобы получить мой результат? Спасибо за помощь.

1 Ответ

0 голосов
/ 11 февраля 2020

Ваш IndexError потому что вы используете range(len(a)) + 1, поэтому вы пытаетесь получить доступ к a[len(a)], который не существует (последний элемент массива всегда имеет индекс len(array) - 1, потому что массивы начинаются с 0 но длина начинается с 1)

, однако, даже когда ошибка индекса исправлена, вы получите неправильные результаты, потому что вы меняете время, перебирая его, что вы не делали в своем стати c решение. Это можно исправить глубокой копией элементов.

import copy
for i in range(len(a)):
    c_entry = copy.deepcopy(a[i])
    for j in range(i):
        c_entry -= b[i-1][j] * a[j]
    c.append(c_entry)
...