#python #numpy #array-broadcasting
Вопрос:
Я написал алгоритм для LU-декомпозиции квадратной матрицы. Проблема, с которой я сталкиваюсь, заключается в том, что значения в срезе 2-d массива NumPy обновляются не так, как ожидалось. Смотрите изображение внизу.
Матрица A определяется следующим образом:
A = np.array([[1, -3, 5, 2], [1, 0, 1, -1], [6, 1, -9, 2], [1, 0, -6, 3]])
Алгоритм:
def LUGAUSS(A):
if A.shape[0] != A.shape[1]:
return "Invalid Matrix. A must be a square marix."
multipliers = dict()
for i in range(A.shape[0]):
print('i',i)
if A[i,i] == 0:
return "Pivot is zero"
else:
multipliers[(i 1,i)] = A[i 1:,i] / A[i,i]
A[i 1:,i] = multipliers[(i 1,i)] # <- !!This line is the problem!!
A[i 1:,i 1:] = A[i 1:,i 1:] - A[i 1:,i].reshape(-1,1) * A[i,i 1:].reshape(1,-1)
L = np.eye(A.shape[0])
for x in range(L.shape[1]):
L[x 1:,x] = multipliers[(x 1,x)]
U = A.copy()
for x in range(U.shape[1]):
U[x 1:,x] = 0
return (L,U,multipliers)
Следующее обновление должно изменить [6,1] на [6.333,1].
Смотрите изображение:
Ответ №1:
B
является целочисленным массивом, поэтому входящие значения преобразуются в целые числа. Если вам нужны поплавки. вы должны использовать astype
для преобразования B
в float64.