Numpy, одни и те же значения вводят разные точки - PullRequest
0 голосов
/ 28 июня 2018

Я хочу получить точечное произведение матрицы X и Adjugate (X) в Python, Numpy, я пробовал оба метода, найденные из здесь . Адъюгат из обоих методов дает один и тот же ответ, но когда я выполняю скалярное произведение, были даны разные ответы. Вот код:

#first method
def CM(A):
    row, col = A.shape
    minor = np.zeros((row-1,col-1))
    cofactor = list()

    for r in range(row):
        for c in range(col):
            minor[:r,:c] = A[:r,:c]
            minor[r:,:c] = A[r+1:,:c]
            minor[:r,c:] = A[:r,c+1:]
            minor[r:,c:] = A[r+1:,c+1:]
            cofactor.append(np.linalg.det(minor)*(-1)**(r+c))

    return np.array(cofactor).reshape(3,3)

#second method
def CM1(A):
    return np.linalg.inv(A).T*np.linalg.det(A)

#define x
X = np.array([[-3,2,-5],[-1,0,-2],[3,-4,1]])
print("Output:\n")
print("X =\n", X)

#the adjugate from both method give same answer
print("\nAdjugate(X) =\n",CM(X).T)
print("\nAdj1(X) =\n",CM1(X).T)

#but when I perform dot product, different answers were given
print("\nX dot Adjugate(X) =\n",X.dot(CM(X).T))
print("\nX dot Adj1(X) =\n",X.dot(CM1(X).T))

Вот вывод:

Output:

X =
 [[-3  2 -5]
 [-1  0 -2]
 [ 3 -4  1]]

Adjugate(X) =
 [[-8. 18. -4.]
 [-5. 12. -1.]
 [ 4. -6.  2.]]

Adj1(X) =
 [[-8. 18. -4.]
 [-5. 12. -1.]
 [ 4. -6.  2.]]

X dot Adjugate(X) =
 [[-6.00000000e+00  1.42108547e-14  0.00000000e+00]
 [-1.77635684e-15 -6.00000000e+00  0.00000000e+00]
 [ 1.06581410e-14 -1.42108547e-14 -6.00000000e+00]]

X dot Adj1(X) =
 [[-6.00000000e+00  6.21724894e-15  2.22044605e-15]
 [ 1.77635684e-15 -6.00000000e+00  8.88178420e-16]
 [-4.44089210e-15 -6.21724894e-15 -6.00000000e+00]]

Затем я пытаюсь проверить это, сравнивая их с обратной матрицей X, на этот раз все обратные X дают одинаковое значение
Код:

print("\nInverse (X) =\n",CM(X).T/np.linalg.det(X))
print("\nInv1 (X) =\n",CM1(X).T/np.linalg.det(X))
print("\nInverse X from numpy =\n",np.linalg.inv(X))

Выход:

Inverse (X) =
 [[ 1.33333333 -3.          0.66666667]
 [ 0.83333333 -2.          0.16666667]
 [-0.66666667  1.         -0.33333333]]

Inv1 (X) =
 [[ 1.33333333 -3.          0.66666667]
 [ 0.83333333 -2.          0.16666667]
 [-0.66666667  1.         -0.33333333]]

Inverse X from numpy =
 [[ 1.33333333 -3.          0.66666667]
 [ 0.83333333 -2.          0.16666667]
 [-0.66666667  1.         -0.33333333]]

Может кто-нибудь объяснить мне, почему?

...