3b1b线性代数基础
零、写在前面
3b1b之前没认真看,闲了整理整理。
一、向量
学习物理的时候,向量是空间中的箭头。由其方向和长度决定。
学习数据结构的时候,向量是有序的数字列表。向量的每一维度有着不同含义。
线性代数中,我们通常认为**向量(vector)**是在某个坐标系中,以原点为起点的箭头。
向量的**坐标(coordinates)**由一组数字组成,其含义为:如何从原点(向量起点)出发到达坐标系中某个点(向量末端)。
对于向量,我们通常写成一个竖着的列表。
向量围绕两种基本运算:向量加法和向量数乘。
向量加法:将相加的两个向量列表的对应位置数字相加,得到的新向量就是向量加法的结果,它描述的是下图中的紫色向量。
分别沿着两个向量移动,等价于直接走相加向量。
向量数乘:将一个标量(scalar)和给定向量的各项相乘,得到的新向量为向量数乘的结果。数乘的本质就是对向量的缩放(scaling)
二、线性组合、张成的空间与基
向量围绕两种基本运算:向量加法和向量数乘。
向量坐标其实就是 数乘后的**基向量(basis vector)**相加 的表示。
如上图的 i j 向量,就是 xy 坐标系的**“基向量”**。
如果我们选择不同的基向量,就会得到合理的新坐标系。
两个数乘向量的和称为两个向量的线性组合(linear combination)。
3b1b作者这样理解“线性”:当固定一个向量,只有另一个向量发生数乘变化,所产生向量的中点会描出一条直线:
如果让数乘的标量随意变化,大多数情况下我们可以抵达空间中任意一点。
当然如果所选取的基向量共线那么只能在一个方向上延伸。
如果选取的是零向量,就只能呆在原点了。
上述的更严格表达:一组向量的任意线性组合构成了给定向量张成的空间(span)
如果有一组向量,我们可以移除其中一个向量而不减少张成的空间,我们称这组向量是**线性相关(linearly dependent)**的。
否则,如果所有向量都给张成的空间增加了新的维度,我们称这组向量为**线性无关(linearly independent)**的。
基的严格定义:向量空间的一组基是张成该空间的一个线性无关向量集
三、矩阵与线性变换
线性变换可以是函数的另一种说法。我们考虑接收一个向量输入,并给出一个向量输出。
从几何上看,线性变换是“保持网格线平行且等距分布”的变换。
如何用数值描述线性变换?——描述变换后基向量即可。
这样一来,不难理解计算几何中的旋转变换是怎么来的了。
线性变换是一种操纵空间的手段,它保持网格线平行且等距分布,并且保持原点不动。
四、矩阵乘法与线性变换复合
如果我们想要描述这样一种作用:一个变换之后再进行另一个变换。
比如我们想要先旋转,然后剪切,我们可以先对向量左乘一个旋转矩阵,得到的结果再左乘一个剪切矩阵。
事实上我们可以用一个新的线性变换来表示这两个独立变换相继作用。这个新的线性变换通常被称为前两个独立变换的“复合变换(composition)”
复合矩阵的计算就是矩阵乘法。
一个矩阵左乘另一个矩阵计算方式为:对右部矩阵的每个基向量施加左部矩阵的线性变换,得到的新的基向量构成的矩阵,就是两个变换的复合变换矩阵。
矩阵乘法显然不符合交换律,因为变换施加顺序影响变换效果。
矩阵乘法显然符合结合律,因为将若干变换复合为一个复合变换,本质仍然是从右往左依次变换。
五、行列式
线性变换实现对空间的挤压/拉伸,那么以二维空间为例,我们如何描述挤压/拉伸后的面积?
我们施加上图的线性变换,发现原来的单位正方形的面积为原来的6倍。
实际上,你只要知道这个单位正方形面积变化的比例,我们就能知道任意区域的面积变化比例。
因为无论怎么线性变换,网格线保持平行且等距分布。
**行列式(determinant)**的值就是区域面积的变化比例。
那么如何解释行列式的值可能为负数?
仍以二维平面为例,基向量 j 初始在 i 的左边,我们施加线性变化后,如果 j 在 i 右边,那么空间定向发生改变,即为什么面积变化比例会是负数。
当我们讨论的对象变成三维空间,行列式的值就是体积变化比例。
我们关注单位正方体的变化情况。
他可能会变成平行六面体。
那么如何解释三维空间下行列式值为负的情况呢?
三维空间的定向我们通常用右手定则来表述。
如果变换后我们仍能用右手定则表述,那么面积变化比例为正,如果只能用左手表述,那么为负。
然而如何计算行列式值呢?
当然,大多数线性代数教科书上会有其他方式计算更高阶的行列式的方法。
理解了行列式的意义,也就不难理解下面这个式子:
六、逆矩阵、列空间与零空间
前面介绍了线性代数对空间的操纵,然而它能被广泛应用于几乎所有领域的一大原因是:它能够帮助我们求解特定的方程组。
在这些方程组中,未知量只有常系数,这些未知量之间只进行加和,没有幂次、奇怪的函数、未知量的乘积等等。
我们通常令未知量处于等号左边,常数项放在等号右边。未知量竖直对齐。
如下图,就被称为线性方程组(linear system of equations)
事实上,我们可以将所有的方程合并为一个向量方程:
A x = v 意味着我们在寻找一个 向量 x 使得它施加了 A这样一个线性变换后和 向量 v 重合。
如果A这个变换并没有进行降维,即行列式非0,那么我们可以找到A 的逆变换 A − 1 A^{-1} A−1,从而求解x:
因为此时逆变换唯一,所以我们有唯一解
但是如果行列式值为0,不存在从低维到高维的变换,所以无解?
事实上,即使不存在逆变换,解仍然可能存在!
比如,一个变换将空间压缩为一条直线,如果v 恰好在这条直线上,那么显然是有解的。
我们注意到一些零行列式的情况比其他情况更加严格,例如三维矩阵将空间压缩为一条直线,此时解存在的难度更高了。
除了零行列式外,我们有特定的术语来描述它们:秩(rank)
如果变换的结果为一维,即一条直线,我们称该变换的 秩(rank) 为1
如果变换后的向量落在某个二维平面上,我们称变换的 秩(rank) 为2
也就是说,**秩(rank)**代表着变换后的空间的维数。
矩阵所有可能的变换结果的集合,称为矩阵的”列空间(column space)“
当秩到达最大值,即和列数相等,我们称之为满秩(full rank)。
注意到,零向量一定会被包含在列空间中,因为线性变换必须保证原点的位置不变。
对于一个满秩矩阵而言,唯一在变换后能落在原点的向量就是零向量本身。
对于一个非满秩矩阵而言,会有一系列的向量变换后能落在原点。
变换后落在原点的向量的集合,被称为矩阵的**“零空间(null space)”或“核(kernal)”**。
至于如何具体求解各种线性方程组,可以翻阅相关教科书。
我们再来看看非方阵的情况。
汤神:三行四列的行列式怎么算?
上例中的三行二列矩阵的列空间是:三维空间中一个过原点的二维平面,注意到这个矩阵仍然是满秩的,因为列空间维数和输入空间维数相等。
三行二列矩阵的含义:将二维空间映射到三维空间上。
- 两列:输入空间有两个基向量
- 三行:每一个基向量变换后都将由三个独立坐标来表示
再来看另一个例子:
输入空间有三个基向量,两行表明三个基向量在变换后都仅用两个坐标来描述。
因此,这是一个从三维空间到二维空间的变换。
七、点积与对偶性
点积在高中数学中就有所涉及,在大多数线性代数课程中也都是比较靠前的内容。
给定两个维数相同的向量,求它们的点积,就是将相应坐标配对,每对坐标乘积相加,就是我们点积的结果。
几何解释:
两个向量的点积就是一个向量在另一个向量的方向上做投影,投影长度和向量长度相乘就是结果。
但是为什么坐标相乘结果之和会与投影有关呢?
我们需要关注更深层次的东西——对偶性(duality)
不少函数能够接收二维向量并且输出一个数,但是线性变换有着更严格的要求:
如果有一系列等距分布于一条直线上的点,然后应用变换,线性变换会保持这些点等距分布于输出空间中,即数轴上,否则该变换就不是线性的。
假如在二维平面中,我们有一个变换将 i hat 和 j hat 分别变换至数轴上的 1 和 -2,那么对于向量 v = (4, 3),就被变换为4 - 3 * 2 = -2
似乎将向量转化为数的线性变换和这个向量本身有着某种关系。
我们说点积就是一个从二维向量到数的线性变换,那么左乘的1x2矩阵就是一个投影矩阵,我们如何找到这个矩阵?
我们考虑这样一条经过原点的数轴,u 是恰好落在数轴上的单位向量,我们发现将 i hat 和 j hat 分别向数轴做投影,投影长度恰好分别为u 的横纵坐标。
这事实上就是变换后的 i hat 和 j hat的位置,即矩阵的列
这就是为什么向量的点积可以解读为将向量投影到单位向量所在直线上所得到的投影长度。
对于非单位向量,我们只需将u 放大相应倍数即可。
任何时候我们看到一个线性变换,它的输出空间是一维数轴。无论其如何定义,空间中会存在唯一的向量v 与之相关。应用变换和与向量v做点积是一样的。
八、叉积
8.1 标准介绍
这里给一个非严格的叉积定义,在二维平面中,我们称 向量v 和 向量w 构成平行四边形的有向面积为向量v 和向量w 的叉积。
正负通过右手定则判断,右手四指从v 弯向 w,大拇指朝外,则为正,否则为负。
仍以二维平面为例,计算方式如下:将v 作为 二维矩阵第一列,w 作为第二列,行列式的值就是叉积结果。
事实上,叉积是通过两个三维向量生成一个新的三维向量。
计算方式如下:
得到的新的三维向量的长度为v 和 w 围成的平行四边形的面积。
8.2 线性变换的角度
前面知道了,向量 v 叉积 向量 w 的结果为垂直于 v 和 w,长度等于 平行四边形面积的向量,满足右手定则。
但是如何验证这个事实?
回顾一下对偶性
对偶性的思想在于,当我们看到一个(多维)空间到数轴的线性变换,它都与那个空间中唯一一个向量对应,即应用线性变换和这个向量点乘等价。
从数值上说,这类线性变换是一个一行的矩阵,每一列给出了变换后数轴上的基向量的位置。
总之,只要看到(从空间)到数轴的线性变换,我们总能找到一个变化的对偶向量(dual vector)。
- 通过v 和 w 构造线性变换
- 求出对偶向量
- 这个求对偶向量的过程就是通过行列式计算叉积的过程
我们尝试分析一下:
我们假设有这样一个函数,一个输入向量,一个输出值,行列式计算结果代表平行六面体的体积。
事实上这个函数是线性的(行列式的分行可加性)
从而说明这个函数是从三维空间到一维空间,那么就存在一个1 * 3的矩阵来表示这个线性变换,即存在一个对偶向量。
我们把这个线性变换写成和对偶向量的点积,并尝试表示出对偶向量 p
我们发现对偶向量就是 v 和 w 坐标的线性组合
还记得我们需要解释这一点:表示叉积的行列式的第一列为什么是 i-hat,j-hat,k-hat?
我们用对偶向量p来表示的话就是p 点成一个向量,使得该向量为行列式第一列,满足:行列式值是 该向量和 v、w 形成的平行四边形构成的平行六面体的有向面积。
而点积的几何意义是一个向量在另一个向量的投影长度乘另一个向量的长度。而p的长度为平行四边形的面积,这说明 (x, y, z) 在 p 上的投影长度为 平行六面体的高,也就是说 p 是垂直于 v 和 的!!!
这就是叉积计算过程和几何解释有关的根本原因!
这也解释了为什么教科书上 三个向量叉积结果会通过三者构成的行列式来计算。
九、基变换
对于同一个向量,我们在不同坐标系下的表示是不同的,因为基向量不同:
虽然不同坐标系基向量不同,但是原点相同。
问题是:如何在不同坐标系之间进行转化?
比如在基向量为: b 1 = [ − 1 , 2 ] T b_1 = [-1, 2]^{T} b1=[−1,2]T, b 2 = [ − 4 , 1 ] T b_2 = [-4, 1]^{T} b2=[−4,1]T的空间下我们对向量 [ − 1 , 1 ] T [-1, 1]^T [−1,1]T进行线性变换
那么我们在基向量为 b 3 = [ 1 , 0 ] T b_3 = [1, 0]^{T} b3=[1,0]T, b 4 = [ 0 , 1 ] T b_4 = [0, 1]^{T} b4=[0,1]T的空间下如何描述那个向量?
其实就是想要找到一个线性变换,使得在 第二个空间下能够把 [ − 1 , 1 ] T [-1, 1]^T [−1,1]T 变换到相应位置
我们不妨想到,我们可以先施加一个第一个空间的逆变换,将其变换到第二个空间,然后再施加对应变换,然后再施加第一个空间的变换给其变换回去,这样就能达到我们的目的了。
在图形学中我们那些复杂的旋转,平移,各种变换其实都是类似思想。
我们在自然坐标系中很容易写出逆时针旋转90°的旋转矩阵,但是换了个其他坐标系就不会了,那么我们当然可以先逆变换到自然坐标系,做完旋转,再变换回去,效果是一样的。
当然,要注意线性变换的施加顺序
在大多数教科书上都会讲解相似矩阵,其实所谓的 A − 1 M A = B A^{-1}MA = B A−1MA=B的含义就是先逆变换,然后施加我们想要的变换,然后再把视角变换回去。
十、特征向量与特征值
已知矩阵就是一种线性变换,如果我们关注线性变换对某一向量的作用,我们发现对于一个线性变换而言,它使得空间中大部分向量偏离其原有的方向。
但我们大多数时候,都能发现有些向量不会偏离方向,而仅仅是长度发生了变化。
上图中的线性变换使得 [ − 1 , 1 ] T [-1, 1]^T [−1,1]T 和 x 轴上的向量长度分别变为原来的 2倍 和 3倍。
这些特殊向量被称为变换的**“特征向量(eigenvector)”,缩放倍数称为特征向量的特征值(eigenvalue)**
特征向量有何用途?
比如三维空间中,我们施加旋转变换,那么特征向量就是旋转轴,这比思考相应的3*3矩阵要直观的多。
值得一提的是,作为旋转轴的特征向量的特征值为1,因为旋转本身不发生缩放。
简单介绍下特征值和特征向量的计算思想,具体过程各教科书上都有。
A v → = λ v → A v → − ( λ I ) v → = 0 → ( A − λ I ) v → = 0 → \begin{align} A\overset{\rightarrow}{v} &= \lambda \overset{\rightarrow}{v} \\ A\overset{\rightarrow}{v} - (\lambda I) \overset{\rightarrow}{v}&=\overset{\rightarrow}0 \\ (A - \lambda I) \overset{\rightarrow}{v} &= \overset{\rightarrow}0 \end{align} Av→Av→−(λI)v→(A−λI)v→=λv→=0→=0→
上式 I 为单位矩阵
我们根据行列式为 0 便可得到关于 λ 的方程,解方程求解 λ 即可
随着λ的变化,行列式的几何意义(面积),也在连续变化,当这个变量使得面积=0的时候,这个变量就是特征值。显然有多个零点,n阶矩阵最多有n个特征值。
有时候也会出现关于λ的方程无解或者不存在实数解的情况。
没有实数解说明不存在特征向量。不过特征值出现复数的情况一般对应于变换中的某种旋转。
也会出现只有一个特征值,但是特征向量不止在一条直线上的情况。
(下图中唯一的特征值是2,但是空间中每一个向量都是特征向量)
最后介绍一下特征基,这将揭示相似对角化的原理。
对于一个对角矩阵,它的解读方式:所有基向量都是该变换的特征向量,特征值就是就是矩阵的对角元。
当特征向量为基底的时候,会有什么好处?
复杂的线性变换可以看成对于特征向量的伸缩。
结合前面基变换的知识,对于一个复杂线性变换,如果我们能够找到足够多(其张成为整个空间)的特征向量,那么我们利用这些特征向量构成的基变换矩阵以及其逆,可以将复杂线性变换简化。
假如我们要求三维矩阵 A 100 A^{100} A100,我们有其特征向量构成的基变换矩阵,特征值分别为 λ 1 , λ 2 , λ 3 \lambda_1, \lambda_2, \lambda_3 λ1,λ2,λ3
那么一定可以得到如下等价变换:
P − 1 A P = [ λ 1 0 0 0 λ 2 0 0 0 λ 3 ] \begin{align} P^{-1} A P = \begin{bmatrix} \lambda1 & 0 & 0 \\ 0 & \lambda2 & 0 \\ 0 & 0 & \lambda3 \end{bmatrix} \end{align} P−1AP= λ1000λ2000λ3
为什么?
因为我们先施加P,然后再施加A,A只会把特征向量拉伸相应倍数,然后再还原,等价于只对特征向量进行拉伸, 等价为对角元为特征向量的对角阵。
当然,前提是我们能找到**”足够多“**的特征向量。
a n = 1 5 [ ( 5 + 1 2 ) n − ( 5 − 1 2 ) n ] a_n=\frac{1}{\sqrt{5}}[\frac{(\sqrt5+1}{2})^n−\frac{(\sqrt5-1}{2})^n] an=51[2(5+1)n−2(5−1)n]
这是斐波那契数列的另一种通项写法,我们从特征向量的角度求解:
如果了解过斐波那契数列,应该都会写下面这个递推:
$$
\begin{bmatrix}
0 & 1 \
1 & 1 \
\end{bmatrix}
\begin{bmatrix}
f_{n - 1} \
f_n \
\end{bmatrix}
=
\begin{bmatrix}
f_{n} \
f_{n + 1} \
\end{bmatrix}
事实上,递推矩阵的特征向量如下: 事实上,递推矩阵的特征向量如下: 事实上,递推矩阵的特征向量如下:
\overset{\rightarrow}{v_1}
=
\begin{bmatrix}
2 \
1+\sqrt{5} \
\end{bmatrix}
\
\overset{\rightarrow}{v_2}
=
\begin{bmatrix}
2 \
1-\sqrt{5} \
\end{bmatrix}
$$
我们会这样求解f(n):
$$
\begin{bmatrix}
0 & 1 \
1 & 1 \
\end{bmatrix}
^n
\begin{bmatrix}
f_{0} \
f_1 \
\end{bmatrix}
=
\begin{bmatrix}
f_{n} \
f_{n + 1} \
\end{bmatrix}
$$
但是了解了特征基之后,我们可以通过 基变换的方式求解,然后就能够推出上面那个复杂的式子(敲latex太累了,不敲了)。
十一、抽象向量空间
我们前面理解向量,可以把向量当作空间中的箭头,然后用实数坐标来描述。也可以把实数坐标当作向量,用空间中的向量来形象地描述它们。
事实上,线性代数中的各种运算其实和基向量或者说坐标系的选取无关:
- 行列式和特征向量
- 可加性(additivity):先加在变换=先变换再加
- 成比例(scaling):先乘再变换=先变换再乘
我们一直一来用实数坐标来描述向量,如果我们用其他东西来描述向量,又该如何理解**空间(space) / 空间性(spatial)**呢?
我们以函数(function)为例:
仍然满足可加性和成比例
因为我们对向量所能进行的操作无非相加和数乘两种。
那么函数意义下的向量,又该如何理解线性变换呢?
求导就是一种线性变换,因为它从一个函数(向量)变化到了另一个函数(向量)
当然,在微积分中,我们称之为算子(operator),而非变换。
“一个函数变换时线性的” 的含义:
线性变换**保持(preserve)**向量加法运算和数乘运算。
求导就是一种线性运算:
我们也可以用矩阵来描述求导:
线性代数中的概念和函数中的概念的类比:
数学中有很多类似向量的事物,只要处理的对象具有合理的数乘和相加概念,不管是空间中的箭头、一组数、函数的集合、还是定义的其他东西,线性代数中所有关于向量、线性变换和其他概念都适用于它。
类似向量的事物,比如箭头、一组数、函数等,它们构成的集合被称为**“向量空间"**。
十二、克莱姆法则几何解释
以二维平面为例,行列式的值代表平行四边形面积变换后的变化比例。
以下面这个方程组为例:
变换前, [ x , y ] T [x, y]^T [x,y]T 和 [ 1 , 0 ] T [1, 0]^T [1,0]T 围成的平行四边形的面积为y
变换后, [ x , y ] T [x, y]^T [x,y]T 变换为 [ 4 , 2 ] T [4, 2]^T [4,2]T ,显然变换后 [ 4 , 2 ] T [4, 2]^T [4,2]T 和 [ 2 , 0 ] T [2, 0]^T [2,0]T围成的平行四边形的面积已知:用 [ x , y ] [x, y] [x,y]替换 [ 0 , 1 ] T [0, 1]^T [0,1]T得到的行列式的值
又因为,变换后面积和变换前面积比例为行列式的值
那么 y = 变换后的面积 变换矩阵的行列式值 y = \frac{变换后的面积}{变换矩阵的行列式值} y=变换矩阵的行列式值变换后的面积
这就是克莱姆法则的几何解释。
相关文章:
3b1b线性代数基础
零、写在前面 3b1b之前没认真看,闲了整理整理。 一、向量 学习物理的时候,向量是空间中的箭头。由其方向和长度决定。 学习数据结构的时候,向量是有序的数字列表。向量的每一维度有着不同含义。 线性代数中,我们通常认为**向量…...
困境如雾路难寻,心若清明步自轻---2024年创作回顾
文章目录 前言博客创作回顾第一次被催更第一次获得证书周榜几篇博客互动最多的最满意的引发思考的 写博契机 碎碎念时也运也部分经验 尾 前言 今年三月份,我已写下一篇《近一年多个人总结》,当时还没开始写博客。四月份写博后,就顺手将那篇总…...
SAP 中的三种内表
文章目录 1 : Introduction2 : Summary3: Reerence document4 : Example 1 : Introduction In the abap development we deal with data and the carrier is internal table . it is transfered in the whole programe. In the interview we offten meet it . What is the dif…...
从0到1学习机器学习实践--1 安装Anaconda
机器学习首先安装conda环境,这个是比较靠谱手把手执行的安装教程 最新最全(亲测)的conda安装教程和虚拟环境安装环境配置...
整合管理输入、工具与技术 、输出
过程输入工具与技术输出制定项目章程1.项目立项文件2.协议3.事业环境因素4.组织过程资产1.专家判断2.数据收集头脑风暴、焦点小组、访谈3.人际关系与团队技能冲突管理、引导、会议管理4.会议1.项目章程2.假设日志制订项目管理计划1.项目章程2.其他过程输出3.事业环境因素4.组织…...
sed — 流编辑器:从入门到精通
内容速览 简介 sed(Stream Editor)是一个功能强大的文本处理工具,广泛应用于文本文件的自动化编辑和批量处理。它通过逐行读取文件内容并在内存中的临时缓冲区(即“模式空间”)中处理文本,实现高效的文本…...
【玩转全栈】----Django基本配置和介绍
目录 Django基本介绍: Django基本配置: 安装Django 创建项目 创建app 注册app Django配置路由URL Django创建视图 启动项目 Django基本介绍: Django是一个开源的、基于Python的高级Web框架,旨在以快速、简洁的方式构建高质量的Web…...
【Linux】文件操作、系统IO相关操作、inode和输入输出重定向
⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 1、理解文件1.1 狭义理解1.2 广义理解1.3 文件操作1.4 系统角度 2、系统文件IO2.1 文件相关操作2.2 文件描述符2.3 重定向 3、动静…...
Prometheus+grafana实践:Doris数据库的监控
文章来源:乐维社区 Doris数据库背景 Doris(Apache Doris)是一个现代化的MPP(Massive Parallel Processing,大规模并行处理)数据库,主要用于在线分析处理(OLAP)场景。 D…...
c语言(转义字符)
前言: 内容: 然后记一下转义字符 \? 在书写连续多个问号时使用,防止他们被解析成三字母词 \ 用于表示字符常量 \\ 用于表示一个反斜杠,防止他被解析为一个转义序列符 \n 换行 \r …...
TOGAF之架构标准规范-信息系统架构 | 数据架构
TOGAF是工业级的企业架构标准规范,信息系统架构阶段是由数据架构阶段以及应用架构阶段构成,本文主要描述信息系统架构阶段中的数据架构阶段。 如上所示,信息系统架构(Information Systems Architectures)在TOGAF标准规…...
快速排序:一种高效的排序算法
前言 排序是最基本和最常用的操作之一。无论是数据处理、搜索优化,还是各种应用程序的内部逻辑,排序算法的选择都直接影响到程序的性能。快速排序(Quick Sort)作为一种典型的分治算法,以其平均时间复杂度 O(n log n) 和优越的实际表现,成为了现代编程中最常用的排序算法…...
PHP:从入门到进阶的编程之旅
在Web开发的广阔天地中,PHP(Hypertext Preprocessor,超文本预处理器)无疑是一颗璀璨的明星。自1995年问世以来,PHP凭借其开源、跨平台、易于学习和使用的特性,迅速成为Web开发领域中最受欢迎的语言之一。本…...
Windows的docker中安装gitlab
一.Windows的docker中安装gitlab 1.通过阿里云拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/lab99/gitlab-ce-zh 2.在本地创建备份数据的目录 mkdir -p D:home/software/gitlab/etc mkdir -p D:home/software/gitlab/logs mkdir -p D:home/software/gitlab/dat…...
计算机网络 (58)无线局域网WLAN
前言 无线局域网WLAN(Wireless Local Area Network)是一种利用无线通信技术将计算机设备互联起来,构成可以互相通信和实现资源共享的网络体系。 一、定义与特点 定义: WLAN通过无线信道代替有线传输介质连接两个或多个设备形成一个…...
LeetCode: 45.跳跃游戏II
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode: 45.跳跃游戏II 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示…...
Blazo-Blazor Web App项目结构
让我们还是从创建项目开始,来一起了解下Blazor Web App的项目情况 创建项目 呈现方式 这里我们可以看到需要选择项目的呈现方式,有以上四种呈现方式 ● WebAssembly ● Server ● Auto(Server and WebAssembly) ● None 纯静态界面静态SSR呈现方式 WebAs…...
汇编语法及相关指令
1.汇编指令的基本格式: <opcode>{<cond>}{s} <Rd>, <Rn>, <shifter_operand> opcode:指令的功能码,用来表示当前指令的作用 cond:条件码,需要在指令执行之前先判断条件受否满足&…...
数据结构——堆(介绍,堆的基本操作、堆排序)
我是一个计算机专业研0的学生卡蒙Camel🐫🐫🐫(刚保研) 记录每天学习过程(主要学习Java、python、人工智能),总结知识点(内容来自:自我总结网上借鉴࿰…...
linux+docker+nacos+mysql部署
一、下载 docker pull mysql:5.7 docker pull nacos/nacos-server:v2.2.2 docker images 二、mysql部署 1、创建目录存储数据信息 mkdir ~/mysql cd ~/mysql 2、运行 MySQL 容器 docker run -id \ -p 3306:3306 \ --name mysql \ -v $PWD/conf:/etc/mysql/conf.d \ -v $PWD/…...
10个非常基础的 Javascript 问题
Javascript是一种用于Web开发的编程语言。JavaScript在网络的客户端上运行。 根据MDN,JavaScript(通常缩写为JS)是一种轻量级的,解释性的,面向对象的语言,具有一流的功能,并且最著名的是Web页面…...
SCP收容物221~225
注 :此文接SCP收容物211~215,本文只供开玩笑 ,与steve_gqq_MC合作 --------------------------------------------------------------------------------------------------------------------------------- 目录 scp-221 scp-222 scp-223 scp-224 scp-225 s…...
基于迁移学习的ResNet50模型实现石榴病害数据集多分类图片预测
完整源码项目包获取→点击文章末尾名片! 番石榴病害数据集 背景描述 番石榴 (Psidium guajava) 是南亚的主要作物,尤其是在孟加拉国。它富含维生素 C 和纤维,支持区域经济和营养。不幸的是,番石榴生产受到降…...
网络(三) 协议
目录 1. IP协议; 2. 以太网协议; 3. DNS协议, ICMP协议, NAT技术. 1. IP协议: 1.1 介绍: 网际互连协议, 网络层是进行数据真正传输的一层, 进行数据从一个主机传输到另一个主机. 网络层可以将数据主机进行传送, 那么传输层保证数据可靠性, 一起就是TCP/IP协议. 路径选择: 确…...
【mptcp】ubuntu18.04和MT7981搭建mptcp测试环境操作说明
目录 安装ubuntu18.04,可以使用虚拟机安装... 2 点击安装VMware Tool 2 更新ubuntu18.04源... 4 安装ifconfig指令工具包... 5 安装vim工具包... 5...
递归的本质
字节面试题叠罗汉,很遗憾没想出来,看了答案挺巧妙的,但是居然是个案例题。。。 复习一下递归的本质 正面解决问题 利用子问题来解决 可以通过规约推导的,基本可以用递归解决! 在写这道算法题时,我想规…...
如何使用tmux !
在tmux的界面按住shift,就可以和普通linux界面一样!!!!!!!! 单击右键可以复制粘贴,滚动鼠标可以上下翻页!!!!…...
【Vim Masterclass 笔记25】S10L45:Vim 多窗口的常用操作方法及相关注意事项
文章目录 S10L45 Working with Multiple Windows1 水平分割窗口2 在水平分割的新窗口中显示其它文件内容3 垂直分割窗口4 窗口的关闭5 在同一窗口水平拆分出多个窗口6 关闭其余窗口7 让四个文件呈田字形排列8 光标在多窗口中的定位9 调节子窗口的尺寸大小10 变换子窗口的位置11…...
C语言练习(16)
猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第10天早上想再吃时,见只剩一个桃子了…...
【0x0012】HCI_Delete_Stored_Link_Key命令详解
目录 一、命令参数 二、命令格式及参数 2.1. HCI_Delete_Stored_Link_Key 命令格式 2.2. BD_ADDR 2.3. Delete_All 三、生成事件及参数 3.1. HCI_Command_Complete事件 3.2. Status 3.3. Num_Keys_Deleted 四、命令执行流程 4.1. 命令发送阶段 4.2. 控制器处理阶段…...
学习ASP.NET Core的身份认证(基于JwtBearer的身份认证10)
基于Cookie传递token的主要思路是通过用户身份验证后,将生成的token保存到Response.Cookies返回客户端,后续客户端访问服务接口时会自动携带Cookie到服务端以便验证身份。之前一直搞不清楚的是服务端程序如何从Cookie读取token进行认证(一般都…...
应用层协议 HTTP 讲解实战:从0实现HTTP 服务器
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 HTTP 协议 🦋 认识 URL🦋 urlencode 和 urldecode 二:🔥 HTTP 协议请求与响应格式 🦋 HTTP 请求…...
Linux权限管理:从用户切换到文件权限
在Linux系统中,权限管理是确保系统安全和资源合理分配的核心机制。它通过用户和用户组的管理、文件权限的设置以及特殊权限的使用,实现了对系统资源的精细控制。 一、用户切换:su 和 sudo 1. 用户切换命令 su su(switch user&a…...
PyQt5超详细教程终篇
PyQt5超详细教程 前言 接: [【Python篇】PyQt5 超详细教程——由入门到精通(序篇)](【Python篇】PyQt5 超详细教程——由入门到精通(序篇)-CSDN博客) 建议把代码复制到pycahrm等IDE上面看实际效果,方便理…...
Alibaba Spring Cloud 四 Seata 的核心组件:TC
Seata 的 Transaction Coordinator (TC) 是分布式事务架构中的核心组件之一,它负责管理全局事务的生命周期,包括事务的创建、状态维护以及协调各分支事务的提交和回滚。以下是有关 TC 的详细解析及其配置和使用方法: 1. TC 的核心功能 全局事…...
机器学习-线性回归(简单回归、多元回归)
这一篇文章,我们主要来理解一下,什么是线性回归中的简单回归和多元回归,顺便掌握一下特征向量的概念。 一、简单回归 简单回归是线性回归的一种最基本形式,它用于研究**一个自变量(输入)与一个因变量&…...
Java如何向http/https接口发出请求
用Java发送web请求所用到的包都在java.net下,在具体使用时可以用如下代码,你可以把它封装成一个工具类 import javax.net.ssl.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Outpu…...
three.js+WebGL踩坑经验合集(1):THREE.Line无故消失的元凶
在项目开发过程中,笔者两次遇到同事的一个提问,我场景中的Line在相机旋转到某些角度或者移动到某些位置的时候会无故消失。由于业务场景复杂,所以这两位同事都是先花费了大量时间排查业务问题,然后才找我求助。这个问题抽象出来的…...
【ROS】RViz2源码分析(四):初始化、启动
【ROS】郭老二博文之:ROS目录 1、简述 RViz2在main函数中,首先注册日志处理函数; 将 RCLCPP_DEBUG 等日志记录函数,通过 rviz_common::set_logging_handlers() 注册到 rviz_common 中。然后,创建界面类 rviz_common::VisualizerApp,并执行初始化 vapp.init(argc, argv)…...
【MySQL】 库的操作
欢迎拜访:雾里看山-CSDN博客 本篇主题:【MySQL】 库的操作 发布时间:2025.1.23 隶属专栏:MySQL 目录 库的创建语法使用 编码规则认识编码集查看数据库默认的编码集和校验集查看数据库支持的编码集和校验集指定编码创建数据库验证不…...
豆包MarsCode 蛇年编程大作战 | 高效开发“蛇年运势预测系统”
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 豆包MarsCode 蛇年编程大作战 | 🐍 蛇年运势预测 在线体验地址:蛇年…...
新能源汽车充电桩选型以及安装应用
摘要:随着当前经济的不断发展,国家的科技也有了飞速的进步,传统的燃油汽车已经不能适应当前社会的发展,不仅对能源造成巨大的消耗,还对环境造成了污染,当前一种新型的交通运输工具正在占领汽车市场。在环境问题和能源问题愈发严重的当今社会,节能减排已经成为全世界的共同课题,…...
docker Ubuntu实战
目录 Ubuntu系统环境说明 一、如何安装docker 二、发布.netcore应用到docker中 三、查看docker信息 Ubuntu系统环境说明 cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.5 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.5 LTS (…...
w-form-select.vue(自定义下拉框组件)(与后端字段直接相关性)
文章目录 1、w-form-select.vue 组件中每个属性的含义2、实例3、源代码 1、w-form-select.vue 组件中每个属性的含义 好的,我们来详细解释 w-form-select.vue 组件中每个属性的含义,并用表格列出它们是否与后端字段直接相关: 属性解释表格&…...
深入探索 Nginx 的高级用法:解锁 Web 服务器的强大潜能
在当下互联网技术飞速发展的浪潮中,Nginx 凭借其轻量级、高性能的特性,在 Web 服务器和反向代理服务器领域脱颖而出,成为众多开发者和运维工程师的得力工具。它不仅能高效处理静态资源,在负载均衡、反向代理等方面也表现出色。然而…...
iOS开发设计模式篇第二篇MVVM设计模式
目录 一、什么是MVVM 二、MVVM 的主要特点 三、MVVM 的架构图 四、MVVM 与其他模式的对比 五、如何在iOS中实现MVVM 1.Model 2.ViewModel 3.View (ViewController) 4.双向绑定 5.文中完整的代码地址 六、MVVM 的优缺点 1.优点 2.缺点 七、MVVM 的应用场景 八、结…...
kettle与Springboot的集成方法,完整支持大数据组件
目录 概要整体架构流程技术名词解释技术细节小结 概要 在现代数据处理和ETL(提取、转换、加载)流程中,Kettle(Pentaho Data Integration, PDI)作为一种强大的开源ETL工具,被广泛应用于各种数据处理场景。…...
详解:TCP/IP五层(四层)协议模型
一.五层(四层)模型 1.概念 TCP/IP协议模型分为五层:物理层、数据链路层、网络层、传输层和应用层。这五层每一层都依赖于其下一层给它提供的网络去实现需求。 1)物理层:这是最基本的一层,也是最接近硬件…...
(七)Mapbox GL JS 表达式初识
以下是关于如何在 Mapbox GL JS 中使用表达式的详细讲解和代码示例。 文章目录 什么是 Mapbox GL JS 表达式?使用场景步骤1. 初始化地图2. 解释表达式 总结 什么是 Mapbox GL JS 表达式? Mapbox GL JS 表达式是一种灵活的样式语言,允许你在 …...
阿里巴巴开发规范手册MySQL
1、MySQL 数据库 1.1、建表规约 1) 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是,0 表示否)。 说明:任何字段如果为非负数,必须是 unsigned。 注…...