标量:
向量:
矩阵:
特殊矩阵:
线性代数实现:
import torch # 标量由只有一个元素的张量表示 x = torch.tensor([3.0]) y = torch.tensor([2.0]) print(x+y, x*y, x/y, x**y) # 可以将向量视为标量值组成的列表 x = torch.arange(4) print(x) # 通过张量的索引来访问任一元素 print(x[3]) # 访问张量的长度 print(len(x)) # 只有一个轴的张量,形状只有一个元素 print(x.shape) # 通过指定两个分量m和n来创建一个形状为m*n的矩阵 A = torch.arange(20).reshape(5,4) print(A) # 矩阵的转置 print(A.T) # 对称矩阵 A=A.T B = torch.tensor([[1,2,3],[2,0,4],[3,4,5]]) print(B, B == B.T, sep='n') # 向量是标量的推广,矩阵是向量的推广,可以构建具有更多轴的数据结构 X = torch.arange(24).reshape(2,3,4) print(X) # 给定任何相同形状的任何两个张量,任何按元素二元运算的结果都将是相同形状的张量 A = torch.arange(20,dtype=torch.float32).reshape(5,4) B = A.clone() # 通过分配新内存,将A的一个副本分配给B print(A,A+B) # 两个矩阵的按元素乘法称为哈达玛积(⊙) print(A*B) a = 2 X = torch.arange(24).reshape(2,3,4) print(a+X,(a*X).shape) # 计算其元素的和 x = torch.arange(4,dtype=torch.float32) print(x, x.sum()) # 表示任意形状张量的元素和 A = torch.arange(20,dtype=torch.float32).reshape(5,4) print(A.shape,A.sum()) # 指定求和汇总张量的轴 A_sum_axis0 = A.sum(axis=0) # 通过求和所有行的元素降维 print(A_sum_axis0, A_sum_axis0.shape) A_sum_axis1 = A.sum(axis=1) # 通过汇总所有列的元素降维,轴1的维数在输出形状中消失 print(A_sum_axis1,A_sum_axis1.shape) print(A.sum(axis=[0,1]).shape) # 等价于对所有元素求和 # 一个与求和相关的量是平均值(mean或average) print(A.sum() / A.numel()) print(A.mean()) # 需要将A的值转成float,不然会报错 # 计算平均值的函数也可以沿指定轴降低张量的维度 print(A.mean(axis=0),A.sum(axis=0) / A.shape[0]) # 计算总和或均值时保持轴数不变 sum_A = A.sum(axis=1,keepdims=True) # keepdims=True保持原来的维数 print(sum_A) # 通过广播将A除以sum_A print(A / sum_A) # 沿某个轴计算A元素的累积总和 print(A.cumsum(axis=0)) # 点积是相同位置的按元素乘积的和 y = torch.ones(4,dtype=torch.float32) print(x, y, torch.dot(x,y)) # 通过执行按元素乘法,然后进行求和来表示两个向量的点积 print(torch.sum(x * y)) # 矩阵向量积Ax是一个长度为m的列向量 print(A.shape, x.shape, torch.mv(A, x)) # torch.mv()是矩阵和向量相乘 # 矩阵-矩阵乘法AB看作是简单地执行m次矩阵-向量积,并将结果拼接在一起,形成一个n*m矩阵 B = torch.ones(4, 3) print(torch.mm(A, B)) # torch.mm()是矩阵正常的矩阵相乘,(a, b)* ( b, c ) = ( a, c ) # L2范数是向量元素平方和的平方根 u = torch.tensor([3.0, -4.0]) print(torch.norm(u)) # L1范数是向量元素的绝对值之和 print(torch.abs(u).sum()) # 矩阵的弗罗贝尼乌斯范数是矩阵元素的平方和的平方根 print(torch.norm(torch.ones((4,9))))
课后练习:
- 证明一个矩阵 A 的转置的转置是 A。
- 给出两个矩阵 A 和 B, 显示转置的和等于和的转置:AT+BT=(A+B)T.
- 给定任意方矩阵 A,A+AT总是对称的吗?为什么?
import torch # 1证明一个矩阵 A 的转置的转置是 A A = torch.tensor([[1,2,3],[2,3,4],[3,4,5]]) print(A.T.T == A) # 2给出两个矩阵 A 和 B, 显示转置的和等于和的转置 B = torch.arange(9).reshape(3,3) print(A.T+B.T == (A+B).T) # 3给定任意方矩阵A,A+AT总是对称的吗 print((A+A.T) == (A+A.T).T)



