向量矩阵,求逆

2024-03-28 14:25:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个维数为nxn的矩阵a,每个矩阵元素是一个大小为M的向量。 我想逆矩阵。换句话说,我想计算一个^-1,它是由大小为M的NxN向量组成的矩阵的倒数

下面是实现我想做的事情的代码,我只是计算m次逆矩阵来计算C=A^-1xb,然后我检查A xc=B。但是每次我迭代A的m元素,B元素来做矩阵求逆。我很肯定我的代码做了我需要的,但不是在一个聪明的方式。。。你知道吗

a = np.array([[[3, 4, 8], [1,8,3]],
     [[2, 1, 2], [6, 5, 0]]])

b = np.array([[2, 0, 6],
     [5, 2, 5]])

c = []
# compute c = a^-1 x b
for i in range(a.shape[-1]):
    c.append(np.linalg.inv(a[:,:,i])@b[:,i])
c = np.asarray(c)

# check inversion compute a x c and checks a x c = b 
for i in range(a.shape[-1]):
    if not np.allclose(a[:,:,i]@c[i,:], b[:,i]):
        raise Exception('Inversion ko')
        break
print('inversion ok')

我需要矩阵运算和元素运算的混合。但我不喜欢我的实现。我是一个非常简单的实现,代码更少。让我知道你的建议。你知道吗


Tags: 代码in元素fornprange矩阵array
2条回答

在将最后一个轴推到前面之后,我们可以在3D数组np.linalg.inv上使用a。然后,我们可以利用einsum作为最终输出的矢量化方式-

p = np.linalg.inv(a.transpose(2,0,1))
c = np.einsum('ijk,kli->ij',p,b)[...,None]

获得最终输出c的一个更简单的方法是使用np.matmul/@-operator-

c = p@b.transpose(2,0,1)

因此,整个过程可以转换为一个线性-

c = np.linalg.inv(a.transpose(2,0,1))@b.transpose(2,0,1)

如果沿着第一个维度而不是最后一个维度堆叠矩阵,则可以在一个np.linalg.pinv()调用中反转它们。然后使用np.einsum()一次性完成所有点积:

a = a.transpose(2, 0, 1)
b = b.transpose()

np.einsum('fmn,fm->fn', np.linalg.inv(a), b)

相关问题 更多 >