pytorch对矩阵(奇异和非奇异)求逆

这篇具有很好参考价值的文章主要介绍了pytorch对矩阵(奇异和非奇异)求逆。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

非奇异矩阵求逆

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))

输出结果:文章来源地址https://www.toymoban.com/news/detail-527118.html

tensor([[ 2.0000, -1.0000],
        [-0.5000,  0.5000]])

到了这里,关于pytorch对矩阵(奇异和非奇异)求逆的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 奇异矩阵与非奇异矩阵(广义逆)

    最近看了一篇多视图聚类的论文,论文代码使用matlab,在matlab中求矩阵的逆是使用了广义的逆pinv,对此很疑惑,整理资料供自己查阅。 奇异矩阵 奇异矩阵的概念源于线性代数,就是对应行列式为0的方阵。 非奇异矩阵 对应行列式非零的方阵为非奇异矩阵。 判断方法 首先看

    2023年04月08日
    浏览(36)
  • 【数学与算法】奇异矩阵、奇异值、奇异值分解、奇异性

    我们经常会碰到几个名词很相近的一些数学术语,例如 奇异矩阵、奇异值、奇异值分解、奇异性 ,经常会混淆,这里把它们的定义放在一起,做一下总结: 1.奇异矩阵: 奇异矩阵 是线性代数的概念,就是该矩阵的 秩不是满秩 。 首先,看这个矩阵是不是方阵,即行数和列数

    2024年02月06日
    浏览(42)
  • 【例题】利用伴随矩阵求逆矩阵

    【例1:同济线代习题二 9.1】求下列矩阵的逆矩阵: A = ( 1 2 2 5 ) boldsymbol{A} = begin{pmatrix} 1 2 \\\\ 2 5 end{pmatrix} A = ( 1 2 ​ 2 5 ​ ) 解答 因为 ∣ A ∣ = 5 − 4 = 1 ≠ 0 |boldsymbol{A}| = 5 - 4 = 1 ne 0 ∣ A ∣ = 5 − 4 = 1  = 0 ,所以 A boldsymbol{A} A 可逆。有 A − 1 = 1 ∣ A ∣ A ∗ = ( 5 − 2 −

    2023年04月11日
    浏览(41)
  • 3.3 伴随矩阵法求逆矩阵

      逆矩阵指的是另一个矩阵和自己相乘会变成单位矩阵,符号是右上角一个 − 1 -1 − 1 ,就是: A A − 1 = A − 1 A = I AA^{-1}=A^{-1}A=I A A − 1 = A − 1 A = I   例如以下两个矩阵就是互为逆矩阵: ( − 1 1 0 0 − 3 2 1 0 1 1 0 − 1 4 − 4 − 1 1 ) ( 1 1 1 1 2 1 1 1 − 1 2 1 1 3 2 1 2 ) = ( 1 0

    2024年02月09日
    浏览(52)
  • 分块矩阵求逆推导 + 矩阵反演公式由来

    引自知乎:https://www.zhihu.com/question/47760591 David Sun 大佬的回答 其实也可以正面刚,下面从正面刚一下: 其实正面刚比上一种解法更简单! PS:啥时候Markdown 编辑公式能像Mathtype 那么方便就好了,这样笔者也不用先在word中编辑一遍再贴个图过来了。 注意到第一种分块矩阵求逆

    2024年02月07日
    浏览(39)
  • Maple矩阵求逆

    如何使用Maple进行矩阵求逆 调用包 输入我想要的矩阵: 然后我使用了Inverse命令 结果并没有生成矩阵的逆。 查了一下说明手册加上 mod 好像也不行,而且手册的mod的参数我也没有看懂。 上网查了一下解决方法: 改用命令 MatrixInverse 就可以了。 完美解决!

    2024年02月11日
    浏览(83)
  • 分块对角矩阵的求逆

    分块对角矩阵的逆矩阵: [ A B C ⋱ ] − 1 = [ A − 1 B − 1 C − 1 ⋱ ] begin{bmatrix} mathbf{A} \\\\ mathbf{B} \\\\ mathbf{C} \\\\ ddots \\\\ end{bmatrix}^{-1} = begin{bmatrix} mathbf{A}^{-1} \\\\ mathbf{B}^{-1} \\\\ mathbf{C}^{-1} \\\\ ddots \\\\ end{bmatrix} ⎣ ⎢ ⎢ ⎡ ​ A ​ B ​ C ​ ⋱ ​ ⎦ ⎥ ⎥ ⎤ ​ − 1 = ⎣ ⎢ ⎢ ⎡

    2024年02月05日
    浏览(55)
  • 线性代数——求逆矩阵

    利用计算技巧凑出公式:两边加E、提取公因式、没有公因式可提时利用隐形的E=AA^(-1),因为E可看作系数1 主对角线有矩阵(副对角线是0矩阵),则分别逆后放在原位置 副对角线有矩阵(主对角线是0矩阵),则分别逆后互换位置

    2024年02月11日
    浏览(52)
  • 线性代数|例题:利用伴随矩阵求逆矩阵

    【例1:同济线代习题二 9.1】求下列矩阵的逆矩阵: A = ( 1 2 2 5 ) boldsymbol{A} = begin{pmatrix} 1 2 \\\\ 2 5 end{pmatrix} A = ( 1 2 ​ 2 5 ​ ) 解答 因为 ∣ A ∣ = 5 − 4 = 1 ≠ 0 |boldsymbol{A}| = 5 - 4 = 1 ne 0 ∣ A ∣ = 5 − 4 = 1  = 0 ,所以 A boldsymbol{A} A 可逆。有 A − 1 = 1 ∣ A ∣ A ∗ = ( 5 − 2 −

    2024年02月08日
    浏览(40)
  • 线代——求逆矩阵的快捷方法

    通常,求逆矩阵有两种方法: 方法一: 方法二: 但是,对于 特殊矩阵 ,如: A = [ a b c d ] A = begin{bmatrix} a b\\\\ c d end{bmatrix} A = [ a c ​ b d ​ ] ,其逆矩阵 A − 1 = 1 a d − b c [ d − b − c a ] A^{-1}=frac{1}{ad-bc}begin{bmatrix} d -b\\\\ -c a end{bmatrix} A − 1 = a d − b c 1 ​ [ d − c ​ − b a

    2023年04月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包