赞
踩
import torch
x = torch.FloatTensor([[[1.0, 2.0],
[1.0, 4.0]],
[[1.0, 2.0],
[1.0, 3.0]]])
y=torch.inverse(x)
print(y)
输出结果为
tensor([[[ 2.0000, -1.0000],
[-0.5000, 0.5000]],
[[ 3.0000, -2.0000],
[-1.0000, 1.0000]]])
或者用
y=torch.linalg.inv(x)
也可以得到相同的结果
import torch
x = torch.FloatTensor([[[1.0, 2.0],
[1.0, 2.0]],
[[1.0, 2.0],
[1.0, 3.0]]])
y=torch.inverse(x)
print(y)
报错:
RuntimeError: inverse_cpu: The diagonal element 2 is zero, the inversion could not be completed because the input matrix is singular.
法1:计算矩阵行列式,计算abs(det)>0的矩阵的逆,删除奇异矩阵。缺点是改变了张量维度。
import torch
from torch.linalg import det
x = torch.FloatTensor([[[1.0, 2.0],
[1.0, 2.0]],
[[1.0, 2.0],
[1.0, 3.0]]])
determinants = torch.det(x)
y =torch.inverse(x[determinants.abs()>0.])
print(y)
输出结果为
tensor([[[ 3., -2.],
[-1., 1.]]])
法2:用torch.linalg.pinv()得到奇异矩阵的伪逆矩阵
import torch
x = torch.FloatTensor([[[1.0, 2.0],
[1.0, 2.0]],
[[1.0, 2.0],
[1.0, 3.0]]])
y=torch.linalg.pinv(x)
print(y)
输出结果为
tensor([[[ 0.1000, 0.1000],
[ 0.2000, 0.2000]],
[[ 3.0000, -2.0000],
[-1.0000, 1.0000]]])
import torch import numpy as np from torch.linalg import det def cof1(M,index): zs = M[:index[0]-1,:index[1]-1] ys = M[:index[0]-1,index[1]:] zx = M[index[0]:,:index[1]-1] yx = M[index[0]:,index[1]:] s = torch.cat((zs,ys),axis=1) x = torch.cat((zx,yx),axis=1) return det(torch.cat((s,x),axis=0)) def alcof(M,index): return pow(-1,index[0]+index[1])*cof1(M,index) def adj(M): result = torch.zeros((M.shape[0],M.shape[1])) for i in range(1,M.shape[0]+1): for j in range(1,M.shape[1]+1): result[j-1][i-1] = alcof(M,[i,j]) return result def invmat(M): return 1.0/det(M)*adj(M) x = torch.FloatTensor([[1.0, 2.0], [1.0, 4.0]]) print(invmat(x))
输出结果:
tensor([[ 2.0000, -1.0000],
[-0.5000, 0.5000]])
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。