【白话机器学习系列】白话张量

news2025/1/10 4:05:47

白话张量

张量(Tensor)是向量和矩阵向 n n n 维的推广。向量是一维张量,矩阵是二维张量。张量作为数值容器,是机器学习,尤其是深度学习中最基础的操作对象,以至于 Google 的机器学习框架都已 TensorFlow 来命名,足见张量在学习中多么重要。不夸张地说,了解张量如何相互作用是机器学习的基本功。本文将用通俗的语言和图例,配合 PyTorch 中张量操作方法为大家深入浅出地讲解张量的必要知识。

在这里插入图片描述

文章目录

    • 概览
    • 向量运算
      • 加法
      • 减法
      • 标量乘法
      • 点积(Dot Product)
      • 哈达玛积(Hadamard Product)
    • 矩阵乘法
    • 张量乘法
    • 总结

概览

我们先来从直观上对张量建立认识。尽管张量看起来很复杂,但我们可以将张量理解为向量和矩阵的集合。向量和矩阵对我们来说更熟悉一些,其实张量不过是向量和矩阵向 n n n 维的推广——向量是一维张量,矩阵是二维张量。理解向量和矩阵对于理解张量至关重要。

向量是元素的一维列表:
x ⃗ = [ x 0 , x 1 , … , x n ] \vec{x} = [x_0, x_1, \dots, x_n] x =[x0,x1,,xn]
矩阵是向量的二维列表:
[ [ x 0 , 0 , x 0 , 1 , x 0 , 2 ] [ x 1 , 0 , x 1 , 1 , x 1 , 2 ] [ x 2 , 0 , x 2 , 1 , x 2 , 2 ] ] = [ x 0 ⃗ x 1 ⃗ x 2 ⃗ ] = X \begin{bmatrix} [x_{0,0}, x_{0,1}, x_{0,2}] \\ [x_{1,0}, x_{1,1}, x_{1,2}] \\ [x_{2,0}, x_{2,1}, x_{2,2}] \\ \end{bmatrix} = \begin{bmatrix} \vec{x_0}\\ \vec{x_1}\\ \vec{x_2}\\ \end{bmatrix} = X [x0,0,x0,1,x0,2][x1,0,x1,1,x1,2][x2,0,x2,1,x2,2] = x0 x1 x2 =X
上面公式的下标表示(行,列)。矩阵的另一种方法是将向量作为元素的向量。矩阵通常用大写字母表示。

三维张量可以视为是矩阵的三维列表:
[ [ [ x 0 , 0 , x 0 , 1 , x 0 , 2 ] [ x 1 , 0 , x 1 , 1 , x 1 , 2 ] [ x 2 , 0 , x 2 , 1 , x 2 , 2 ] ] [ [ x 0 , 0 , x 0 , 1 , x 0 , 2 ] [ x 1 , 0 , x 1 , 1 , x 1 , 2 ] [ x 2 , 0 , x 2 , 1 , x 2 , 2 ] ] [ [ x 0 , 0 , x 0 , 1 , x 0 , 2 ] [ x 1 , 0 , x 1 , 1 , x 1 , 2 ] [ x 2 , 0 , x 2 , 1 , x 2 , 2 ] ] ] = [ [ x 0 ⃗ x 1 ⃗ x 2 ⃗ ] [ x 0 ⃗ x 1 ⃗ x 2 ⃗ ] [ x 0 ⃗ x 1 ⃗ x 2 ⃗ ] ] = [ X 0 X 1 X 2 ] = χ \begin{bmatrix} \begin{bmatrix} [x_{0,0}, x_{0,1}, x_{0,2}] \\ [x_{1,0}, x_{1,1}, x_{1,2}] \\ [x_{2,0}, x_{2,1}, x_{2,2}] \\ \end{bmatrix} \\ \begin{bmatrix} [x_{0,0}, x_{0,1}, x_{0,2}] \\ [x_{1,0}, x_{1,1}, x_{1,2}] \\ [x_{2,0}, x_{2,1}, x_{2,2}] \\ \end{bmatrix} \\ \begin{bmatrix} [x_{0,0}, x_{0,1}, x_{0,2}] \\ [x_{1,0}, x_{1,1}, x_{1,2}] \\ [x_{2,0}, x_{2,1}, x_{2,2}] \\ \end{bmatrix} \\ \end{bmatrix} = \begin{bmatrix} \begin{bmatrix} \vec{x_0}\\ \vec{x_1}\\ \vec{x_2}\\ \end{bmatrix} \\ \begin{bmatrix} \vec{x_0}\\ \vec{x_1}\\ \vec{x_2}\\ \end{bmatrix} \\ \begin{bmatrix} \vec{x_0}\\ \vec{x_1}\\ \vec{x_2}\\ \end{bmatrix} \\ \end{bmatrix} = \begin{bmatrix} X_0\\ X_1\\ X_2\\ \end{bmatrix} = \chi [x0,0,x0,1,x0,2][x1,0,x1,1,x1,2][x2,0,x2,1,x2,2] [x0,0,x0,1,x0,2][x1,0,x1,1,x1,2][x2,0,x2,1,x2,2] [x0,0,x0,1,x0,2][x1,0,x1,1,x1,2][x2,0,x2,1,x2,2] = x0 x1 x2 x0 x1 x2 x0 x1 x2 = X0X1X2 =χ
三维张量的另一种方法是将矩阵作为元素的向量。

四维张量可以被认为是三维张量的四维列表。将四维张量展开写出来会非常展版面,这里我只写出矩阵向量的向量和三维张量向量形式。
[ [ X 0 X 1 X 2 ] [ X 0 X 1 X 2 ] [ X 0 X 1 X 2 ] ] = [ χ 0 χ 1 χ 2 ] = T 4 D \begin{bmatrix} \begin{bmatrix} X_0\\ X_1\\ X_2\\ \end{bmatrix} \\ \begin{bmatrix} X_0\\ X_1\\ X_2\\ \end{bmatrix} \\ \begin{bmatrix} X_0\\ X_1\\ X_2\\ \end{bmatrix} \\ \end{bmatrix} = \begin{bmatrix} \chi_0\\ \chi_1\\ \chi_2\\ \end{bmatrix} = T_{4D} X0X1X2 X0X1X2 X0X1X2 = χ0χ1χ2 =T4D
运用类似的原理,我们可以递归的写出任意维张量。

向量运算

设有两个长度为 i i i 的向量 x ⃗ , y ⃗ \vec{x}, \vec{y} x ,y
x ⃗ = [ x 0 , x 1 , … , x i ] y ⃗ = [ y 0 , y 1 , … , y i ] \vec{x} = [x_0, x_1, \dots, x_i]\\ \vec{y} = [y_0, y_1, \dots, y_i] x =[x0,x1,,xi]y =[y0,y1,,yi]
我们可以 x ⃗ , y ⃗ \vec{x}, \vec{y} x ,y 上定义加法、减法、标量乘法、点积、哈达玛积等一系列运算。这些运算主要针对向量中的元素进行的,也就是说两个向量中的对应元素之间进行计算。

加法

向量加法定义如下:
x ⃗ + y ⃗ = [ x 0 , x 1 , … , x i ] + [ y 0 , y 1 , … , y i ] = [ x 0 + y 0 , x 1 + y 1 , … , x i + y i ] \vec{x} + \vec{y} = [x_0, x_1, \dots, x_i] + [y_0, y_1, \dots, y_i] = [x_0+y_0, x_1+y_1, \dots, x_i+y_i] x +y =[x0,x1,,xi]+[y0,y1,,yi]=[x0+y0,x1+y1,,xi+yi]
直白的说就是将向量中的对应元素相加。

在 PyTorch 中可以直接用 + 实现张量相加:

import torch

x = torch.tensor([1, 3, 5])
y = torch.tensor([3, 7, 4])

x + y
# Output: tensor([ 4, 10,  9])

减法

向量加法定义如下:
x ⃗ − y ⃗ = [ x 0 , x 1 , … , x i ] − [ y 0 , y 1 , … , y i ] = [ x 0 − y 0 , x 1 − y 1 , … , x i − y i ] \vec{x} - \vec{y} = [x_0, x_1, \dots, x_i] - [y_0, y_1, \dots, y_i] = [x_0-y_0, x_1-y_1, \dots, x_i-y_i] x y =[x0,x1,,xi][y0,y1,,yi]=[x0y0,x1y1,,xiyi]
跟向量加法类似,向量减法就是向量中的对应元素相减。

在 PyTorch 中可以直接用 - 实现张量相加:

x = torch.tensor([1, 3, 5])
y = torch.tensor([3, 7, 4])

x - y
# Output: tensor([-2, -4,  1])

标量乘法

标量乘法是将一个标量 k k k 与向量中的每一个元素相乘,其定义如下:
k x ⃗ = k [ x 0 , x 1 , … , x i ] = [ k x 0 , k x 1 , … , k x i ] k\vec{x} = k[x_0, x_1, \dots, x_i] = [kx_0, kx_1, \dots, kx_i] kx =k[x0,x1,,xi]=[kx0,kx1,,kxi]
标量乘法有点像乘法分配律,其中标量 k k k 一般为实数。

在 PyTorch 中可以直接用 * 实现标量与张量相乘:

k = 5
x = torch.tensor([1, 3, 5])

k * x
# Output: tensor([ 5, 15, 25])

点积(Dot Product)

点积我在上一篇文章 《白话点积》 中有详细介绍,这里不过多赘述。其定义为:
x ⃗ ⋅ y ⃗ = [ x 0 , x 1 , … , x i ] ⋅ [ y 0 , y 1 , … , y i ] = x 0 y 0 + x 1 y 1 + ⋯ + x i y i = ∑ n = 0 i x n y n \vec{x} \sdot \vec{y} = [x_0, x_1, \dots, x_i] \sdot [y_0, y_1, \dots, y_i] = x_0y_0+ x_1y_1+ \dots + x_iy_i = \sum_{n=0}^ix_ny_n x y =[x0,x1,,xi][y0,y1,,yi]=x0y0+x1y1++xiyi=n=0ixnyn
在 PyTorch 中可以用 dot 方法求两个张量的点积:

x = torch.tensor([1, 3, 5])
y = torch.tensor([3, 7, 4])

torch.dot(x, y) # 1*3 + 3*7 + 5*4 = 3 + 21 + 20 = 44
# Output: tensor(44)

PyTorch 中点积还可以用更直观的 @ 运算符来计算,因此上面的代码还可以写成

x @ y # 与 torch.dot(x, y) 等价

注意,点积的结果是一个标量。

哈达玛积(Hadamard Product)

哈达玛积与点积类似,将向量各对应元素相乘,与点积不同的是,哈达玛积不将对应元素的相乘结果累计,而是返回对应元素相乘结果的向量。哈达玛积的定义如下:
x ⃗ ⊙ y ⃗ = [ x 0 , x 1 , … , x i ] ⊙ [ y 0 , y 1 , … , y i ] = [ x 0 y 0 , x 1 y 1 , … , x i y i ] \vec{x} \odot \vec{y} = [x_0, x_1, \dots, x_i] \odot [y_0, y_1, \dots, y_i] = [x_0y_0, x_1y_1, \dots, x_iy_i] x y =[x0,x1,,xi][y0,y1,,yi]=[x0y0,x1y1,,xiyi]
在 PyTorch 中可以用 * 计算两个张量的哈达玛积:

x = torch.tensor([1, 3, 5])
y = torch.tensor([3, 7, 4])

x * y
# Output: tensor([ 3, 21, 20])

矩阵乘法

矩阵是向量的集合,因此矩阵的加法、减法、标量乘法和哈达玛积与向量是一样的,都是对应元素计算即可。不同的是点积。前面强调过向量的点积是一个标量,而矩阵的点积不是这样。

X , Y X, Y X,Y 是 2 个 4 × 3 4 \times 3 4×3 的矩阵:
X = [ [ x 0 , 0 , x 0 , 1 , x 0 , 2 ] [ x 1 , 0 , x 1 , 1 , x 1 , 2 ] [ x 2 , 0 , x 2 , 1 , x 2 , 2 ] [ x 3 , 0 , x 3 , 1 , x 3 , 2 ] ] Y = [ [ y 0 , 0 , y 0 , 1 , y 0 , 2 ] [ y 1 , 0 , y 1 , 1 , y 1 , 2 ] [ y 2 , 0 , y 2 , 1 , y 2 , 2 ] [ y 3 , 0 , y 3 , 1 , y 3 , 2 ] ] X = \begin{bmatrix} [x_{0,0}, x_{0,1}, x_{0,2}] \\ [x_{1,0}, x_{1,1}, x_{1,2}] \\ [x_{2,0}, x_{2,1}, x_{2,2}] \\ [x_{3,0}, x_{3,1}, x_{3,2}] \\ \end{bmatrix}\\ Y = \begin{bmatrix} [y_{0,0}, y_{0,1}, y_{0,2}] \\ [y_{1,0}, y_{1,1}, y_{1,2}] \\ [y_{2,0}, y_{2,1}, y_{2,2}] \\ [y_{3,0}, y_{3,1}, y_{3,2}] \\ \end{bmatrix}\\ X= [x0,0,x0,1,x0,2][x1,0,x1,1,x1,2][x2,0,x2,1,x2,2][x3,0,x3,1,x3,2] Y= [y0,0,y0,1,y0,2][y1,0,y1,1,y1,2][y2,0,y2,1,y2,2][y3,0,y3,1,y3,2]
矩阵乘法定义如下:
X Y = [ x 0 , 0 x 0 , 1 x 0 , 2 x 1 , 0 x 1 , 1 x 1 , 2 x 2 , 0 x 2 , 1 x 2 , 2 x 3 , 0 x 3 , 1 x 3 , 2 ] [ y 0 , 0 y 0 , 1 y 0 , 2 y 1 , 0 y 1 , 1 y 1 , 2 y 2 , 0 y 2 , 1 y 2 , 2 y 3 , 0 y 3 , 1 y 3 , 2 ] T = [ x 0 , 0 x 0 , 1 x 0 , 2 x 1 , 0 x 1 , 1 x 1 , 2 x 2 , 0 x 2 , 1 x 2 , 2 x 3 , 0 x 3 , 1 x 3 , 2 ] [ y 0 , 0 y 1 , 0 y 2 , 0 y 3 , 0 y 0 , 1 y 1 , 1 y 2 , 1 y 3 , 1 y 0 , 2 y 1 , 2 y 2 , 2 y 3 , 2 ] = [ x 0 , 0 y 0 , 0 + x 0 , 1 y 0 , 1 + x 0 , 2 y 0 , 2 x 0 , 0 y 1 , 0 + x 0 , 1 y 1 , 1 + x 0 , 2 y 1 , 2 x 0 , 0 y 2 , 0 + x 0 , 1 y 2 , 1 + x 0 , 2 y 2 , 2 x 0 , 0 y 3 , 0 + x 0 , 1 y 3 , 1 + x 0 , 2 y 3 , 2 x 1 , 0 y 0 , 0 + x 1 , 1 y 0 , 1 + x 1 , 2 y 0 , 2 x 1 , 0 y 1 , 0 + x 1 , 1 y 1 , 1 + x 1 , 2 y 1 , 2 x 1 , 0 y 2 , 0 + x 1 , 1 y 2 , 1 + x 1 , 2 y 2 , 2 x 1 , 0 y 3 , 0 + x 1 , 1 y 3 , 1 + x 1 , 2 y 3 , 2 x 2 , 0 y 0 , 0 + x 2 , 1 y 0 , 1 + x 2 , 2 y 0 , 2 x 2 , 0 y 1 , 0 + x 2 , 1 y 1 , 1 + x 2 , 2 y 1 , 2 x 2 , 0 y 2 , 0 + x 2 , 1 y 2 , 1 + x 2 , 2 y 2 , 2 x 2 , 0 y 3 , 0 + x 2 , 1 y 3 , 1 + x 2 , 2 y 3 , 2 x 3 , 0 y 0 , 0 + x 3 , 1 y 0 , 1 + x 3 , 2 y 0 , 2 x 3 , 0 y 1 , 0 + x 3 , 1 y 1 , 1 + x 3 , 2 y 1 , 2 x 3 , 0 y 2 , 0 + x 3 , 1 y 2 , 1 + x 3 , 2 y 2 , 2 x 3 , 0 y 3 , 0 + x 3 , 1 y 3 , 1 + x 3 , 2 y 3 , 2 ] \begin{aligned} XY &= \begin{bmatrix} x_{0,0}& x_{0,1}& x_{0,2} \\ x_{1,0}& x_{1,1}& x_{1,2} \\ x_{2,0}& x_{2,1}& x_{2,2} \\ x_{3,0}& x_{3,1}& x_{3,2} \\ \end{bmatrix}\begin{bmatrix} y_{0,0}& y_{0,1}& y_{0,2} \\ y_{1,0}& y_{1,1}& y_{1,2} \\ y_{2,0}& y_{2,1}& y_{2,2} \\ y_{3,0}& y_{3,1}& y_{3,2} \\ \end{bmatrix}^T\\ &=\begin{bmatrix} x_{0,0}& x_{0,1}& x_{0,2} \\ x_{1,0}& x_{1,1}& x_{1,2} \\ x_{2,0}& x_{2,1}& x_{2,2} \\ x_{3,0}& x_{3,1}& x_{3,2} \\ \end{bmatrix}\begin{bmatrix} y_{0,0}& y_{1,0}& y_{2,0} & y_{3,0} \\ y_{0,1}& y_{1,1}& y_{2,1} & y_{3,1} \\ y_{0,2}& y_{1,2}& y_{2,2} & y_{3,2} \\ \end{bmatrix}\\ &=\begin{bmatrix} x_{0,0}y_{0,0}+x_{0,1}y_{0,1}+x_{0,2}y_{0,2}&x_{0,0}y_{1,0}+x_{0,1}y_{1,1}+x_{0,2}y_{1,2} & x_{0,0}y_{2,0}+x_{0,1}y_{2,1}+x_{0,2}y_{2,2}& x_{0,0}y_{3,0}+x_{0,1}y_{3,1}+x_{0,2}y_{3,2} \\ x_{1,0}y_{0,0}+x_{1,1}y_{0,1}+x_{1,2}y_{0,2}&x_{1,0}y_{1,0}+x_{1,1}y_{1,1}+x_{1,2}y_{1,2} & x_{1,0}y_{2,0}+x_{1,1}y_{2,1}+x_{1,2}y_{2,2}& x_{1,0}y_{3,0}+x_{1,1}y_{3,1}+x_{1,2}y_{3,2} \\ x_{2,0}y_{0,0}+x_{2,1}y_{0,1}+x_{2,2}y_{0,2}&x_{2,0}y_{1,0}+x_{2,1}y_{1,1}+x_{2,2}y_{1,2} & x_{2,0}y_{2,0}+x_{2,1}y_{2,1}+x_{2,2}y_{2,2}& x_{2,0}y_{3,0}+x_{2,1}y_{3,1}+x_{2,2}y_{3,2} \\ x_{3,0}y_{0,0}+x_{3,1}y_{0,1}+x_{3,2}y_{0,2}&x_{3,0}y_{1,0}+x_{3,1}y_{1,1}+x_{3,2}y_{1,2} & x_{3,0}y_{2,0}+x_{3,1}y_{2,1}+x_{3,2}y_{2,2}& x_{3,0}y_{3,0}+x_{3,1}y_{3,1}+x_{3,2}y_{3,2} \end{bmatrix} \end{aligned} XY= x0,0x1,0x2,0x3,0x0,1x1,1x2,1x3,1x0,2x1,2x2,2x3,2 y0,0y1,0y2,0y3,0y0,1y1,1y2,1y3,1y0,2y1,2y2,2y3,2 T= x0,0x1,0x2,0x3,0x0,1x1,1x2,1x3,1x0,2x1,2x2,2x3,2 y0,0y0,1y0,2y1,0y1,1y1,2y2,0y2,1y2,2y3,0y3,1y3,2 = x0,0y0,0+x0,1y0,1+x0,2y0,2x1,0y0,0+x1,1y0,1+x1,2y0,2x2,0y0,0+x2,1y0,1+x2,2y0,2x3,0y0,0+x3,1y0,1+x3,2y0,2x0,0y1,0+x0,1y1,1+x0,2y1,2x1,0y1,0+x1,1y1,1+x1,2y1,2x2,0y1,0+x2,1y1,1+x2,2y1,2x3,0y1,0+x3,1y1,1+x3,2y1,2x0,0y2,0+x0,1y2,1+x0,2y2,2x1,0y2,0+x1,1y2,1+x1,2y2,2x2,0y2,0+x2,1y2,1+x2,2y2,2x3,0y2,0+x3,1y2,1+x3,2y2,2x0,0y3,0+x0,1y3,1+x0,2y3,2x1,0y3,0+x1,1y3,1+x1,2y3,2x2,0y3,0+x2,1y3,1+x2,2y3,2x3,0y3,0+x3,1y3,1+x3,2y3,2
上面的过程虽然复杂,其实如果我们将矩阵看作是由向量组成的,上面的运算过程其实就是将组成矩阵的向量两两相乘,运算结果就是结果矩阵的一个元素。我们定义矩阵乘法的运算规则为用第一个矩阵的行乘以第二个矩阵的列,因此只有当第一个矩阵中的行数与第二个矩阵的列数匹配时,才能进行乘法运算。为了满足运算规则,所以我们将矩阵 Y Y Y 转置了一下( T ^T T 是转置运算符),使其变成 3 × 4 3 \times 4 3×4 矩阵,这样两个矩阵的行列元素才能对应上。
X Y = ( 4 , 3 ) × ( 4 , 3 ) T = ( 4 , 3 ) × ( 3 , 4 ) = ( 4 , 4 ) \begin{aligned} XY &= (4,3) \times (4,3)^T\\ &=(4,3) \times (3,4)\\ &=(4,4) \end{aligned} XY=(4,3)×(4,3)T=(4,3)×(3,4)=(4,4)
因此我们可以总结出矩阵乘法的一半要求:
( m , n ) × ( n , r ) = ( m , r ) (m, n) \times (n, r) = (m, r) (m,n)×(n,r)=(m,r)
在 PyTorch 中可以用 matmul 方法对两个矩阵进行乘法运算:

X = torch.tensor([[1, 3, 5],
                  [3, 6, 1],
                  [6, 8, 5],
                  [7, 3, 2]])

Y = torch.tensor([[6, 3, 2],
                  [8, 5, 4],
                  [3, 1, 7],
                  [1, 8, 3]])

X.matmul(Y.T)
# Output: tensor([[ 25,  43,  41,  40],
#        		  [ 38,  58,  22,  54],
#        		  [ 70, 108,  61,  85],
#        		  [ 55,  79,  38,  37]])

其中 Y.T 是转置操作。矩阵乘法也可以用 X @ Y.T 来实现。

张量乘法

理解了矩阵乘法后,我们再来看一下更高维度的张量如何相乘。

矩阵乘法我们可以简单地总结为行乘以列,放到更高维的张量中,除了行与列还有其他维度,甚至何为行、何为列都很模糊。那么张量应该如何相乘呢?

其实运用类比思维,这个问题也好理解。我们将矩阵视为向量的集合,三维张量视为矩阵的集合。因此对于三维张量来说,就是张量中的矩阵两两相乘,矩阵相乘我们前面已经介绍过,只需按照矩阵乘法的运算规则进行计算即可。下图可以更清晰地展示这个过程:

在这里插入图片描述

矩阵运算需要满足 ( m , n ) × ( n , r ) = ( m , r ) (m, n) \times (n, r) = (m, r) (m,n)×(n,r)=(m,r) ,三维张量视为矩阵的集合,我们只需要将张量中的矩阵转置然后两两相乘即可,因此三维张量相乘只需要保证第一个维度不变,让剩下的两个维度满足矩阵乘法的运算要求即可:
( z , m , n ) × ( z , n , r ) = ( z , m , r ) (z, m, n) \times (z, n, r) = (z, m, r) (z,m,n)×(z,n,r)=(z,m,r)
类似的思想可以扩展到四维张量上,四维张量是三维张量的集合,因此四维张量相乘就是将三维张量两两相乘,三维张量相乘再视为其包含的矩阵两两相乘。从某种意义上说,张量相乘就像一个嵌套的点积。
( c , z , m , n ) × ( c , z , n , r ) = ( c , z , m , r ) (c, z, m, n) \times (c, z, n, r) = (c, z, m, r) (c,z,m,n)×(c,z,n,r)=(c,z,m,r)
这个思想递归下去可以推出任意维张量乘法。

代码上,我们可以用 transpose() 方法传入要转置的2个维度

X.matmul(Y.transpose(1,2))

总结

张量运算是机器学习中最常用到的操作,理解张量对每一个机器学习工程师都直观重要。上面内容为了简单易懂可能在数学上有失严谨,全面严谨的讲解建议大家系统性地学习一下线性代数,这里推荐 Gilbert Strang 老爷子的 Introduction to Linear Algebra,这本书是我读过对初学者最友好的线性代数书。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/600683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ffmpeg在windows环境下的详细安装教程

这两天整理好用的录屏软件,发现了Captura这个软件,软件本身的安装很简单,但由于Captura需要依赖ffmpeg(一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序),而ffmpeg在安…

springboot X-Accel-Redirect 大文件下载实现

文章目录 前言一、什么是 X-Sendfile?二、相关请求头说明三、食用步骤总结 前言 文件下载的方式: nginx代理附件路径,直接访问。无法控制用户的权限。服务端流式读取文件内容。这个过程需要后端进程将文件读取到内存中然后再发给用户&#…

全民开发|零代码平台搭建库存管理系统,助力企业降本增效

什么是库存管理系统 库存管理系统是一种用于监控和跟踪商业组织存货的系统机软件。它帮助企业管理其库存,确保所需的商品和服务始终可用,并在需要时提供报告和预测。库存管理系统可追踪库存级别、库存周转率、订单、销售和交付等方面的数据,…

LIS系统源码

LIS系统(Laboratory Information System) 即实验室(检验科)信息系统,它是医院信息管理的重要组成部分之一,自从人类社会进入信息时代,信息技术的迅速发展加快了各行各业现代化与信息化的进程。LIS系统逐步采用了智能辅…

​​​​Linux Shell 实现一键部署postgres15

postgres 前言 PostgreSQL 是一个功能强大的开源对象关系数据库系统,拥有超过 35 年的积极开发经验 这为其赢得了可靠性、功能稳健性和性能的良好声誉。 通过官方文档可以找到大量描述如何安装和使用 PostgreSQL 的信息。 开源社区提供了许多有用的地方来熟悉Postg…

【是德出品,必属精品】示波器探头的11个误解

误解1. 100 MHz 的“信号”,使用 100 MHz 的示波器探头。 示波器探头带宽与配合它们使用的示波器带宽采用相同的方法进行规定,即产品响应的 -3dB 点。举例来说,如果使用 100 MHz 带宽的探头测量 100 MHz 1Vpp 正弦波,那么探头输出…

挖掘算力产业的创新力量和新型机遇|2023 开放原子全球开源峰会先进计算分论坛即将启幕

随着高新技术激发出磅礴的发展势能,海量的算力需求也在不断提升。如何升级和创新现有算力格局,打造多维感知、异构计算、智能调度的先进计算算力网?如何真正实现 “打破算力烟囱”、让算力像水和电一样流动起来?已成为时下焦点话题…

提升倾斜摄影三维模型数据的几何坐标纠正和三维重建速度具体技术方法探讨

提升倾斜摄影三维模型数据的几何坐标纠正和三维重建速度具体技术方法探讨 倾斜摄影三维模型数据的几何坐标变换和三维重建是一项非常耗时的任务,因此如何提高其速度一直是研究的重点。以下是一些实现倾斜摄影三维模型数据的几何坐标变换和三维重建速度的方法&#x…

网站建设对企业会有什么影响

随着互联网的发展,如今网络的普及,很多企业都开始搭建网站,以便展示自己的企业形象和产品。很多企业会认为,网站建设是一件很麻烦的事情,如果需要在网上宣传的话,就用一个链接来做好了。实际上不是这样的&a…

Linux 系统大技能,搞定 90% 日常运维

一、Linux 系统日常运维九大技能 1、安装部署 方式:U盘,光盘和网络安装 其中网络安装已经成为了目前批量部署的首选方式:主要工具有Cobbler和PXEkickstart 可以参考如下链接内容: http://www.cnblogs.com/mchina/p/centos-px…

智能语音信息处理团队14篇论文被语音技术顶会Interspeech 2023接收

近日,Interspeech 2023会议发出了审稿结果通知,语音及语言信息处理国家工程研究中心智能语音信息处理团队共14篇论文被会议接收,论文方向涵盖语音识别、语音合成、话者识别、语音增强、情感识别、声音事件检测等,各接收论文简介见…

WordPress主题Modown_v8.7主题免授权+Erphpdown15.21+团购+第三方登录

团购内置在主题里面了已不需要安装插件了,官方带免费子主题,主题无需授权和其他操作,安装启用即可免授权使用 主题简介 Modown是模板兔基于Erphpdown wordpress下载插件开发的一款全新的针对收费付费下载资源/付费查看内容/VIP会员免费下载查看/虚拟资源售卖的WordPress主题…

基于html+css的图展示104

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

Vue+springboot篮球文化体育商城商铺系统的设计与实现

随着生活和工作方面的压力逐渐增加,人们对网购的依赖和需求也就变得越来越大。篮球文化商铺是一个能使得人在繁忙或者不喜欢出门的人,足不出户而又很方便地购买到自己喜爱的篮球商品,这样既满足了自己的心灵需要,也不会影响到工作…

chatgpt赋能python:Python几次方介绍

Python几次方介绍 Python是一种通用编程语言,具有快速开发和易于阅读的优点。Python具有各种强大的功能,包括能够计算数值的能力。本文将介绍Python几次方的相关知识。 Python几次方的语法 要在Python中进行几次方运算,可以使用双星号&…

15、Redis数据库

1、数据库相关知识简介 1、数据库分类 关系型数据库:Oracle,MySQL,SqlServer,DB2NoSql数据库:NoSQL最常见的解释是“non-relational”, “Not Only SQL”也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,…

在ArcGIS中制作一幅“合格”的地图

在现代化的社会中,对各种不同类型的专题地图的需求以及使用更加地频繁,在很多小伙伴的论文写作过程中是不是也需要一张美观大方的研究区概况图呢?答案是肯定的。除了研究区概况图之外,很多地理空间相关的表达都可以借助ArcGIS软件…

电子企业搭建MES生产管理系统的解决方案

随着科技的不断进步,电子企业的发展也日益迅速。然而,在生产管理过程中,电子企业面临着许多挑战,如生产流程复杂、产品质量不易控制、生产效率低下等问题。为解决这些问题,电子企业需要搭建MES生产管理系统。本文将探讨…

WordPress网站如何在文章内容中插入广告或其他内容

您想在 WordPress 的帖子内容中插入广告吗? 您的帖子内容是访问者与您的网站最互动的地方,这使其成为展示广告的理想场所。 在本文中,我们将展示三种在 WordPress 的帖子内容中插入广告的方法。 本文网址: https://wpzhanzhang.eastfu.com…

Linux——什么是文件描述符

目录 前文 一,为什么有文件描述符 二,什么是文件描述符 2.1 文件操作接口 2.2 文件描述符 三,文件描述符的原理 四,文件描述符的分配规则 前文 本文主要是详解一下文件描述符,我们从1.为什么?2.是什么&…