工科数学基础系列(1)——矩阵微分

工科数学基础系列文章

下面是工科数学基础系列文章的总链接,本人发表这个系列的文章链接均收录于此

数学基础系列文章链接


下面是专栏地址:

工科数学基础系列专栏


文章目录

  • 工科数学基础系列文章
    • 数学基础系列文章链接
    • 工科数学基础系列专栏
  • 前言
  • 工科数学基础系列(1)——矩阵微分
    • 布局(Layout)
        • 矩阵向量求导引入
        • 矩阵向量求导定义
        • 矩阵向量求导布局
        • 分母布局的另一种求解方法
    • 基本的求导规则
      • **向量**对**标量**求导(相对于数量变量的微分,即自变量是数量变量)
        • 定义
        • 运算法则
      • 标量 y 对向量 x 求导(数量函数相对于向量的微分)
        • 定义
        • 运算法则


前言

这个系列的文章是分享工科数学基础系列


工科数学基础系列(1)——矩阵微分

布局(Layout)

矩阵向量求导引入

在高等数学里面,我们已经学过了标量对标量的求导,比如标量 y 对标量 x 的求导,可以表示为 ∂ y ∂ x \frac{\partial y}{\partial x} xy

有些时候,我们会有一组标量 y i , i = 1 , 2 , ⋯ , m y_i,i=1,2,\cdots,m yi,i=1,2,,m来对一个标量 x 的求导,那么我们会得到一组标量求导的结果:
∂ y i ∂ x , i = 1 , 2. , , m \dfrac{\partial y_i}{\partial x},i=1,2.,,m xyi,i=1,2.,,m
如果我们把这组标量写成向量的形式,即得到维度为m的一个向量 y 对一个标量 x 的求导,那么结果也是一个m维的向量 ∂ y ∂ x \frac{\partial \bf{y}}{\partial x} xy

可见,所谓向量对标量的求导,其实就是向量里的每个分量分别对标量求导,最后把求导的结果排列在一起,按一个向量表示而已。类似的结论也存在于标量对向量的求导,向量对向量的求导,向量对矩阵的求导,矩阵对向量的求导,以及矩阵对矩阵的求导等。

总而言之,所谓的向量矩阵求导本质上就是多元函数求导,仅仅是把把函数的自变量,因变量以及标量求导的结果排列成了向量矩阵的形式,方便表达与计算,更加简洁而已。

为了便于描述,后面如果没有指明,则第一章求导的自变量用 x x x(不加粗) 表示标量 x \bf{x} x(加粗)表示n维向量X 表示 m×n 维度的矩阵,求导的因变量用 y y y(不加粗) 表示标量, y \bf{y} y(加粗)表示m维向量Y表示 p×q 维度的矩阵。

矩阵向量求导定义

根据求导的自变量和因变量是标量,向量还是矩阵,我们有9种可能的矩阵求导定义,如下:

自变量\因变量标量 y y y向量y矩阵Y
标量 x x x ∂ y ∂ x \frac{\partial y}{\partial x} xy ∂ y ∂ x \frac{\partial \bf{y}}{\partial x} xy ∂ Y ∂ x \frac{\partial \bf{Y}}{\partial x} xY
向量x ∂ y ∂ x \frac{\partial y}{\partial \bf{x}} xy ∂ y ∂ x \frac{\partial \bf{y}}{\partial \bf{x}} xy ∂ Y ∂ x \frac{\partial \bf{Y}}{\partial \bf{x}} xY
矩阵X ∂ y ∂ X \frac{\partial y}{\partial \bf{X}} Xy ∂ y ∂ X \frac{\partial \bf{y}}{\partial \bf{X}} Xy ∂ Y ∂ X \frac{\partial \bf{Y}}{\partial \bf{X}} XY

这9种里面,标量对标量的求导高数里面就有,不需要我们单独讨论。在剩下的8种情况里面,我们先讨论上图中标量对向量或矩阵求导,向量或矩阵对标量求导,以及向量对向量求导这5种情况。另外三种向量对矩阵的求导,矩阵对向量的求导,以及矩阵对矩阵的求导我们在后面再讲。

前面讲到的例子,维度为m的一个向量y对一个标量 x x x的求导,那么结果也是一个m维的向量 ∂ y ∂ x \frac{\partial \bf{y}}{\partial x} xy。这是我们表格里面向量对标量求导的情况。这里有一个问题没有讲到,就是这个m维求导结果排列成的m维向量到底应该是列向量还是行向量

这个问题的答案是:行向量或者列向量皆可!毕竟我们求导的本质只是把标量求导的结果排列起来,至于是按行排列还是按列排列都是可以的。但是这样也有问题,在我们机器学习算法法优化过程中,如果行向量或者列向量随便写,那么结果就不唯一,乱套了。

为了解决这个问题,我们引入求导布局的概念。

矩阵向量求导布局

矩阵求导,想必许多领域能见到。不同的文献中,同样的式子求导的结果有时候会不一样,仔细观察会发现刚好相差一个转置,于是我们得先说说求导的两个派别(布局)

矩阵求导有两种布局,分子布局(numerator layout)分母布局(denominator layout)。如下所示:

分子布局,就是分子是列向量形式,分母是行向量形式,矩阵的第一个维度以分子为准,即结果是一个 m×n 的矩阵,如下式。
∂ f ( x ) ∂ x 3 × 1 T = [ ∂ f ∂ x 1 , ∂ f ∂ x 2 , ∂ f ∂ x 3 ] = [ 2 x 1 + x 2 , x 1 + x 3 , x 2 ] \dfrac{\partial f(\boldsymbol{x})}{\partial\boldsymbol{x}_{3\times1}^T}=\left[\dfrac{\partial f}{\partial x_1},\dfrac{\partial f}{\partial x_2},\dfrac{\partial f}{\partial x_3}\right]=\left[2x_1+x_2,x_1+x_3,x_2\right] x3×1Tf(x)=[x1f,x2f,x3f]=[2x1+x2,x1+x3,x2]
如果这里的 function 是实向量函数 f 2 × 1 f_{2×1} f2×1 的话,结果就是 2×3 的矩阵了:
∂ f 2 × 1 ( x ) ∂ x 3 × 1 T = [ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 ∂ f 1 ∂ x 3 ∂ f 2 ∂ x 1 ∂ f 2 ∂ x 2 ∂ f 2 ∂ x 3 ] 2 × 3 \frac{\partial\boldsymbol{f}_{2\times1}(\boldsymbol{x})}{\partial\boldsymbol{x}_{3\times1}^{T}}=\begin{bmatrix}\frac{\partial f_{1}}{\partial x_{1}}&\frac{\partial f_{1}}{\partial x_{2}}&\frac{\partial f_{1}}{\partial x_{3}}\\ \frac{\partial f_{2}}{\partial x_{1}}&\frac{\partial f_{2}}{\partial x_{2}}&\frac{\partial f_{2}}{\partial x_{3}}\end{bmatrix}_{2\times3} x3×1Tf2×1(x)=[x1f1x1f2x2f1x2f2x3f1x3f2]2×3
更一般的,
∂ y ∂ x = ( ∂ y 1 ∂ x 1 ∂ y 1 ∂ x 2 ⋯ ∂ y 1 ∂ x n ∂ y 2 ∂ x 1 ∂ y 2 ∂ x 2 ⋯ ∂ y 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ y n ∂ x 1 ∂ y n ∂ x 2 ⋯ ∂ y n ∂ x n ) \frac{\partial\mathbf{y}}{\partial\mathbf{x}}=\left(\begin{array}{cccc}\frac{\partial y_1}{\partial x_1}&\frac{\partial y_1}{\partial x_2}&\cdots&\frac{\partial y_1}{\partial x_n}\\ \frac{\partial y_2}{\partial x_1}&\frac{\partial y_2}{\partial x_2}&\cdots&\frac{\partial y_2}{\partial x_n}\\ \vdots&\vdots&\ddots&\vdots\\ \frac{\partial y_n}{\partial x_1}&\frac{\partial y_n}{\partial x_2}&\cdots&\frac{\partial y_n}{\partial x_n}\end{array}\right) xy= x1y1x1y2x1ynx2y1x2y2x2ynxny1xny2xnyn
上边这个按分子布局向量对向量求导的结果矩阵,我们一般叫做雅克比 (Jacobian)矩阵。有的资料上会使用 ∂ y ∂ x T \frac{\partial \mathbf{y}}{\partial \mathbf{x}^{T}} xTy来定义雅克比矩阵,意义是一样的。

分母布局,就是分母是列向量形式,分子是行向量形式,求导的结果矩阵的第一维度会以分母为准,即结果是一个 n×m 的矩阵,如下式。
∂ f ( x ) ∂ x 3 × 1 = [ ∂ f ∂ x 1 ∂ f ∂ x 2 ∂ f ∂ x 3 ] = [ 2 x 1 + x 2 x 1 + x 3 x 2 ] \dfrac{\partial f(\boldsymbol{x})}{\partial\boldsymbol{x}_{3\times1}}=\begin{bmatrix}\frac{\partial f}{\partial x_1}\\ \frac{\partial f}{\partial x_2}\\ \frac{\partial f}{\partial x_3}\end{bmatrix}=\begin{bmatrix}2x_1+x_2\\ x_1+x_3\\ x_2\end{bmatrix} x3×1f(x)= x1fx2fx3f = 2x1+x2x1+x3x2
如果这里的 function 是实向量函数 f 2 × 1 f_{2×1} f2×1 的话,结果就是 3×2 的矩阵了:
∂ f 2 × 1 T ( x ) ∂ x 3 × 1 = [ ∂ f 1 ∂ x 1 ∂ f 2 ∂ x 1 ∂ f 1 ∂ x 2 ∂ f 2 ∂ x 2 ∂ f 1 ∂ x 3 ∂ f 2 ∂ x 3 ] 3 × 2 \frac{\partial\boldsymbol{f}_{2\times1}^T(\boldsymbol{x})}{\partial\boldsymbol{x}_{3\times1}}=\begin{bmatrix}\frac{\partial f_1}{\partial x_1}&\frac{\partial f_2}{\partial x_1}\\ \frac{\partial f_1}{\partial x_2}&\frac{\partial f_2}{\partial x_2}\\ \frac{\partial f_1}{\partial x_3}&\frac{\partial f_2}{\partial x_3}\end{bmatrix}_{3\times2} x3×1f2×1T(x)= x1f1x2f1x3f1x1f2x2f2x3f2 3×2
更一般的,
∂ y ∂ x = ( ∂ y 1 ∂ x 1 ∂ y 2 ∂ x 1 … ∂ y m ∂ x 1 ∂ y 1 ∂ x 2 ∂ y 2 ∂ x 2 … ∂ y m ∂ x 2 ⋮ ⋮ ⋱ ⋮ ∂ y 1 ∂ x n ∂ y 2 ∂ x n … ∂ y m ∂ x n ) \frac{\partial\mathbf{y}}{\partial\mathbf{x}}=\begin{pmatrix}\frac{\partial y_{1}}{\partial x_{1}}&\frac{\partial y_{2}}{\partial x_{1}}&\ldots&\frac{\partial y_{m}}{\partial x_{1}}\\ \frac{\partial y_{1}}{\partial x_{2}}&\frac{\partial y_{2}}{\partial x_{2}}&\ldots&\frac{\partial y_{m}}{\partial x_{2}}\\ \vdots&\vdots&\ddots&\vdots\\ \frac{\partial y_{1}}{\partial x_{n}}&\frac{\partial y_{2}}{\partial x_{n}}&\ldots&\frac{\partial y_{m}}{\partial x_{n}}\end{pmatrix} xy= x1y1x2y1xny1x1y2x2y2xny2x1ymx2ymxnym
上边这个按分母布局向量对向量求导的结果矩阵,我们一般叫做梯度矩阵。有的资料上会使用 ∂ y T ∂ x \frac{\partial \mathbf{y}^{T}}{\partial \mathbf{x}} xyT来定义梯度矩阵,意义是一样的。

这两种布局间的关系是
∂ y T ∂ x = ( ∂ y ∂ x T ) T \frac{\partial \mathbf{y}^{T}}{\partial \mathbf{x}}=(\frac{\partial \mathbf{y}}{\partial \mathbf{x}^{T}})^T xyT=(xTy)T
有了布局的概念,我们对于上面5种求导类型,可以各选择一种布局来求导。但是对于某一种求导类型,不能同时使用分子布局和分母布局求导。

但是在机器学习算法原理的资料推导里,我们并没有看到说正在使用什么布局,也就是说布局被隐含了,这就需要自己去推演,比较麻烦。但是一般来说我们会使用一种叫混合布局的思路,即如果是向量或者矩阵对标量求导,则使用分子布局为准,如果是标量对向量或者矩阵求导,则以分母布局为准。对于向量对对向量求导,有些分歧。

(1)向量和标量

  • 对于分子布局来说,我们求导结果的维度以分子为主,比如对于我们上面向量对标量求导的例子,结果的维度和分子的维度是一致的。也就是说,如果向量y是一个m维的列向量,那么求导结果 ∂ y ∂ x \frac{\partial \bf{y}}{\partial x} xy也是一个m维列向量。如果向量y是一个m维行向量,那么求导结果 ∂ y ∂ x \frac{\partial \bf{y}}{\partial x} xy也是一个m维行向量

  • 对于分母布局来说,我们求导结果的维度以分母为主,比如对于我们上面向量对标量求导的例子,如果向量y是一个m维的列向量,那么求导结果 ∂ y ∂ x \frac{\partial \bf{y}}{\partial x} xy是一个m维行向量。如果向量y是一个m维的行向量,那么求导结果 ∂ y ∂ x \frac{\partial \bf{y}}{\partial x} xy是一个m维的列向量

可见,对于分子布局和分母布局的结果来说,两者相差一个转置。

(2)矩阵和向量

标量y 对**矩阵X(m×n)**求导:

  • 如果是分子布局,则求导结果的维度为 n×m

  • 如果按分母布局,则求导结果的维度和矩阵X的维度 m×n 是一致的。

这样,对于标量对向量或者矩阵求导,向量或者矩阵对标量求导这4种情况,对应的分子布局和分母布局的排列方式已经确定了。

(3)向量和向量

稍微麻烦点的是向量对向量的求导,本文只讨论列向量对列向量的求导,其他的行向量求导只是差一个转置而已。比如m维列向量yn维列向量x 求导。对于这2个向量求导,那么一共有 mn个标量对标量的求导。求导的结果一般是排列为一个矩阵。

例如,假设 y 为 m 维列向量,x 为 n 维列向量。 ∂ y ∂ x \frac{\partial \bf{y}}{\partial \bf{x}} xy如果采用的是分子布局,则是 m×n 矩阵,而如果采用的是分母布局,则是 n×m 矩阵。

分母布局的另一种求解方法

已知:
A m × n = [ a 11 a 12 … a 1 n a 21 a 22 … a 2 n … … a m 1 a m 2 … a m n ] , x = [ x 1 x 2 … x n ] , 那么 A X = [ a 11 x 1 + a 12 x 2 + . . . + a 1 n x n a 21 x 1 + a 22 x 2 + . . . + a 2 n x n . . . a m 1 x 1 + a m 2 x 2 + . . . + a m n x n ] m = 1 ∂ A x ∂ x = [ a 11 a 21 … a m 1 a 12 a 22 … a m 2 . . . a 1 n a 2 n … a m n ] = A T A_{m\times n}=\begin{bmatrix}a_{11}&a_{12}&\ldots &a_{1n}\\ a_{21}&a_{22}&\ldots&a_{2n}\\ \ldots&\ldots\\ a_{m1}&a_{m2}&\ldots &a_{mn}\end{bmatrix},\mathbf{x}=\begin{bmatrix}x_1\\ x_2\\ \ldots\\ x_{n}\end{bmatrix}, \\那么A_{\mathbf{X}}={\left[\begin{array}{l}{a_{11}x_{1}+a_{12}x_{2}+...+a_{1n}x_{n}}\\ {a_{21}x_{1}+a_{22}x_{2}+...+a_{2n}x_{n}}\\ {...}\\ {a_{m1}x_{1}+a_{m2}x_{2}+...+a_{m n}x_{n}}\end{array}\right]}_{m=1} \\ \dfrac{\partial A x}{\partial x}=\begin{bmatrix}a_{11}a_{21}\ldots a_{m1}\\ a_{12}a_{22}\ldots a_{m2}\\...\\ a_{1n}a_{2n}\ldots a_{mn}\end{bmatrix}=A^T Am×n= a11a21am1a12a22am2a1na2namn ,x= x1x2xn ,那么AX= a11x1+a12x2+...+a1nxna21x1+a22x2+...+a2nxn...am1x1+am2x2+...+amnxn m=1xAx= a11a21am1a12a22am2...a1na2namn =AT
对谁求导数,就以谁(分母)作为主序,得出结果。比如这里x是列向量,求Ax关于x求导数,那么对x的每个分量分别求偏导数(写成一行),然后整理排成一列(同x一样是列向量)

同理有: ∂ A x ∂ x T = A \frac{\partial\mathbf{A}\mathbf{x}}{\partial\mathbf{x}^{\mathbf{T}}}=\mathbf{A} xTAx=A

关于x的转置 x T \mathbf{x}^T xT求导数, x T \mathbf{x}^T xT是行向量,那么Ax分别对 x T \mathbf{x}^T xT向量中的分量求偏导(写成一列),然后整体排成一行(同 x T \mathbf{x}^T xT行向量)。

基本的求导规则

因为向量标量都可以表示成简单的矩阵形式,所以这里我们使用“矩阵”来泛化的表示所有含义。我们使用黑体字母来表示向量,而黑体大写字母表示矩阵。

向量标量求导(相对于数量变量的微分,即自变量是数量变量)

定义

首先是向量 y标量 x 求导,我们假定所有的向量都是列向量
y = [ y 1 y 2 ⋮ y m ] \mathbf{y}=\begin{bmatrix}y_1\\ y_2\\ \vdots\\ y_m\end{bmatrix} y= y1y2ym
分子布局下,
∂ y ∂ x = [ ∂ y 1 ∂ x ∂ y 2 ∂ x ⋮ ∂ y m ∂ x ] \dfrac{\partial\mathbf{y}}{\partial x}=\begin{bmatrix}\frac{\partial y_1}{\partial x}\\ \frac{\partial y_2}{\partial x}\\ \vdots\\ \frac{\partial y_m}{\partial x}\end{bmatrix} xy= xy1xy2xym
而在分母布局下,
∂ y ∂ x = [ ∂ y 1 ∂ x ∂ y 2 ∂ x … ∂ y m ∂ x ] \dfrac{\partial\mathbf{y}}{\partial x}=\begin{bmatrix}\dfrac{\partial y_1}{\partial x}\quad\dfrac{\partial y_2}{\partial x}\quad\dots\quad\dfrac{\partial y_m}{\partial x}\end{bmatrix} xy=[xy1xy2xym]
在接下来的部分将默认使用分母布局,除非是在一些很特殊的情形,这些到时候再详述。

运算法则

相对于数量变量的微分

(1) d ( A ± B ) d t = d A d t ± d B d t {\frac{d\left(A\pm B\right)}{d t}=\frac{d A}{d t}\pm\frac{d B}{d t}} dtd(A±B)=dtdA±dtdB

(2) d ( λ A ) d t = d λ d t A + λ d A d t \frac{d\left(\lambda A\right)}{d t}=\frac{d\lambda}{d t}A+\lambda\frac{d A}{d t} dtd(λA)=dtdλA+λdtdA

(3) d d t ( a T b ) = d a T d t b + a T d b d t \frac{d}{d t}\left(a^Tb\right)=\frac{d a^{T}}{d t}b+a^{T}\frac{d b}{d t} dtd(aTb)=dtdaTb+aTdtdb

(4) d d t ( A B ) = d A d t B + A d B d t \frac{d}{d t}\left(A B\right)=\frac{d A}{d t}B+A\frac{d B}{d t} dtd(AB)=dtdAB+AdtdB

标量 y 对向量 x 求导(数量函数相对于向量的微分)

定义

分母布局
f ( x ) = f ( x 1 , x 2 , ⋯ x n ) x = [ x 1 , x 2 ⋯ x n ] T d f ( x ) d x = [ ∂ f ∂ x 1 ∂ f ∂ x 2 ⋯ ∂ f ∂ x n ] T f\left(x\right)=f\left(x_{1},x_{2},\cdots x_{n}\right)\quad x=\left[x_{1},x_{2}\cdots x_{n}\right]^{\text{T}} \\ \dfrac{df(x)}{dx}=\left[\dfrac{\partial f}{\partial x_1}\quad \dfrac{\partial f}{\partial x_2}\quad \cdots \quad \dfrac{\partial f}{\partial x_n}\right]^T f(x)=f(x1,x2,xn)x=[x1,x2xn]Tdxdf(x)=[x1fx2fxnf]T
此式为数学中梯度的定义,表示为 g r a d [ f ( x ) ] grad[f(x)] grad[f(x)]或者 ∇ f ( x ) \nabla f(x) f(x)

分子布局:
d f ( x ) d x T = [ ∂ f ∂ x 1 ∂ f ∂ x 2 ⋯ ∂ f ∂ x n ] \dfrac{df(x)}{dx^T}=\left[\dfrac{\partial f}{\partial x_1}\quad \dfrac{\partial f}{\partial x_2}\quad \cdots\quad \dfrac{\partial f}{\partial x_n}\right] dxTdf(x)=[x1fx2fxnf]

运算法则

f ( x ) , g ( x ) f(x),g(x) f(x),g(x)

(1) d ( f ± g ) d x = d f d x ± d g d x \dfrac{d\left(f\pm g\right)}{dx}=\dfrac{df}{dx}\pm\dfrac{dg}{dx} dxd(f±g)=dxdf±dxdg

(2) d ( f g ) = d f d x g + f d g d x d\left(fg\right)=\dfrac{df}{dx}g+f\dfrac{dg}{dx} d(fg)=dxdfg+fdxdg

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

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

相关文章

系列十二、Linux中安装Zookeeper

一、Linux中安装Zookeeper 1.1、下载安装包 官网:Index of /dist/zookeeper/zookeeper-3.4.11 我分享的链接: 链接:https://pan.baidu.com/s/14Hugqxcgp89f2hqGWDwoBw?pwdyyds 提取码:yyds 1.2、上传至/opt目录 1.3、解…

ffmpeg 解码文件时的时间戳问题

实时流和普通文件 1 实时流 实时流编码时,我们一般不进行b帧编码,但是文件存储时为了减小大小,会增加b帧,实时流只带了I,P帧,那就会好很多 2 普通文件 很多文件带了b帧,所以要使用解码时间去同…

SpringMVC之视图和RESTful

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

Linux 线程安全 (2)

文章目录 线程同步概念条件变量使用生产消费模型信号量的使用读写锁的使用 Linux 线程安全 (1) 线程同步概念 竞态条件:因为时序问题,而导致程序异常. 饥饿问题:只使用互相锁保证线程安全时,锁资源总被某…

篇章二 | Python 入门指南:深入理解基础数据类型

Python 是一门强大而易学的编程语言,而深刻理解其基础数据类型是掌握 Python 编程的重要一步。本入门指南将详细介绍 Python 中的基础数据类型,包括整数、浮点数、字符串、布尔值、列表、元组、字典和集合等,同时提供注意事项和与 C 语言的区…

【浏览器】Web存储梳理和总结

目录 1. 前言 2. cookie 3. sessionStorage和localStorage 4. indexedDB 4.1 IDBFactory原型对象的方法(indexedDB是IDBFactory的实例化对象) 4.2 操作请求IDBOpenDBRequest和IDBRequest(IDBRequest继承于EventTarget) 4.3 …

浅谈【GPU和CPU】

GPU和显卡的区别 GPU(Graphics Processing Unit,图形处理器)通常指的就是显卡。显卡是一种安装在计算机中的扩展卡,主要用于图形和图像处理任务。 GPU作为显卡的核心组件,负责处理图形渲染、图像处理、视频解码和其他…

每天坐在电脑前10小时的投资者的现货黄金投资秘密

很多人在现货黄金市场中苦作舟,希望通过交易、实践来找出市场中的奥秘。笔者最近看了一个每天坐在电脑面前十个小时以上做分析和投资的投资者的经验介绍,他道出了一些投资的秘密,笔者认为,这是适合现货黄金投资者借鉴和学习的&…

派生类的构造与析构函数(C++)

3.3 派生类的构造与析构函数3.3.1 构造3.3.2 析构 3.3 派生类的构造与析构函数 3.3.1 构造 如果子类构造函数没有显式指明基类部分(基类子对象)的初始化方式,那么编译器将会自动调用基类的无参构造函数来初始化基类子对象。 如果希望以有参…

java SSM课程平台系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM课程平台系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S…

【方法】Word文档如何设置密码?

Word文档可以设置密码保护,如果想要保护文档不被随意打开,可以设置“打开密码”;如果想保护文档不被随意编辑,可以设置“限制密码”;如果当心自己不小心修改了文档,可以设置“只读模式”密码,使…

一篇文章带你入门PHP魔术方法

PHP魔术方法 PHP 中的"魔术方法"是一组特殊的方法,它们在特定情况下自动被调用。这些方法的名称都是以两个下划线(__)开头。魔术方法提供了一种方式来执行各种高级编程技巧,使得对象的行为可以更加灵活和强大。以下是一…

DSG YashanDB数据交互解决方案:更稳、更快、更安全

近期,深圳计算科学研究院(简称“深算院”)携手迪思杰(北京)数据管理技术有限公司(简称“DSG”)重磅推出基于崖山数据库的数据交互解决方案,具备双向迁移同步、性能稳定、支持复杂对象…

余弦相似度算法

余弦相似度算法 是什么 余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。 余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性&q…

表情串转换

前言 NWAFU 2021阶段二 D 一、题目描述 题目描述 在一个字符串中,设置了由‘/’前导字符和某些特定字母构成的转义子字符串,如“/s”、“/f”、“/c”等用于表示特殊表情符号。现要求编写一个函数,将给定字符串中的转义字符串转换为表情字…

AD20PCB笔记(写给第三次重学PCB的自己)

readme:我曾以为自己本科毕业以后,再也不会用到PCB了,因为本科毕设的时候自己设计的PCB开发板出现了严重的设计问题,在实际测试的过程中,电源一上电,板子芯片直接炸飞,当时真的让我很害怕&#…

JavaScript实现视频共享

1.视频共享webrtc-master index.html <!DOCTYPE html> <html> <head><script typetext/javascript srchttps://cdn.scaledrone.com/scaledrone.min.js></script><meta charset"utf-8"><meta name"viewport" cont…

c++学习笔记(10)-可变参数模板

1、概念 可变参数模板&#xff08;Variable Template Parameters&#xff09;是 C11 中引入的一种语法&#xff0c;它允许函数或类模板接受可变数量的参数。这样可以方便地定义操作适用于多个类型和/或值的函数或类模板。 使用可变参数模板时&#xff0c;可以在模板参数列表中…

【MySQL】在数据目录之外创建InnoDB 表(Creating Tables Externally)

文章目录 【MySQL】在数据目录之外创建InnoDB 表&#xff08;Creating Tables Externally&#xff09;创建表时使用DATA DIRECTORY选项&#xff08;单独表空间&#xff09;innodb_file_per_table设置为开启状态&#xff08;默认&#xff09;innodb_file_per_table设置为关闭状态…

linux iptables简介

表与链 iptables是4表五链 4表&#xff1a;filter表&#xff08;过滤表&#xff09; nat表 raw表 mangle表 五链&#xff1a;INPUT OUTPUT FORWARD PREROUTING POSTROUTING &#xff08;所有链的名字要大写&#xff09; pre…之前 post…之后 filter表 iptables默认操作…