当前位置: 首页 > news >正文

线性代数的本质笔记(3B1B课程)

文章目录

  • 前言
  • 向量
  • 矩阵
  • 行列式
  • 线性方程
  • 非方阵
  • 点积
  • 叉积
  • 基变换
  • 特征向量与特征值
  • 抽象向量空间

前言

最近在复习线代,李永乐的基础课我刷了一下,感觉讲的不够透彻,和我当年学线代的感觉一样,就是不够形象。

比如,行列式为什么那么重要,它的含义究竟是什么?特征值到底代表了什么?等等。说白了,我需要几何直观的理解。

几何直观解决的问题是,我为什么要用这个,有什么用,而数值计算只是让我们能应用罢了,可惜我们只是学了数值计算。

于是我开始刷3b1b的《线性代数的本质》

这篇文章是观看视频后我的个人感悟,可以结合视频一起食用,有解释的不清楚的地方,以视频为准,毕竟我理解的还是不够深入

线性代数的本质

向量

在线性代数中,向量是以原点为起点的箭头,终点坐标和向量的值是一样的。

因此,向量之间的空间上的运算也可以变成向量值的运算,比如向量和(移动),向量数乘(缩放)。

之所以能够用向量对应向量值,是因为有一个i和j的基底。说白了,就是坐标系。如果基底变了,要保持向量不变的话,向量值就要改变。

总之,用数值(向量值)描述向量,要依赖于基底。

如果两个基底不共线(线性无关),则可以张成一个面,否则只能是一条线

如果是三个线性无关的向量,则可以张成一个三维空间,如果是n个线性无关的向量,则可以张成n维空间,但是这个就是无法想象的了。

如何理解线性相关呢?所谓线性相关,就是说某一个向量落在了其他向量张成的空间内,不需要这个向量了,可以移除这个向量而不影响向量组张成的空间。

假设给定3个向量的向量组,假设两个向量共线,那么必然线性相关(充分条件),但是如果三个向量都不共线,就能说明线性无关了吗?不能。

下面4条等价:

  1. 线性相关
  2. 有一个向量落在其他两个向量张成的平面内
  3. 该向量可以被其他向量线性表出
  4. 存在不全为0的k,使得
    k 1 α 1 + ⋯ + k n α n = 0 k_1\alpha_1+\cdots+k_n\alpha_n=0 k1α1++knαn=0

前面的都好理解,第4条可以这么理解,基于3,可以得到第i个向量=其他向量的线性组合,那么令 k i = − 1 k_i=-1 ki=1,不就是一组不全为0的系数,让这个向量组的计算结果=0吗?

矩阵

矩阵有两种含义

  1. 向量组
  2. 对向量的线性变换

给定一个向量,乘一个矩阵,就可以变成新向量,这就是矩阵的几何意义。

当一个矩阵里面的所有向量被同时变换,那就是矩阵的线性变换。

但是无论是向量,还是矩阵,其变换都是通过乘以矩阵实现的。

实际上任何函数都可以变换空间,只是线性变换后,曾经的直线还是直线,原点也没有变化。本质在于,线性变换是均匀的,保持网格线平行等距均匀分布的变换。

在这里插入图片描述

用另一个说法去说,就是基底是线性变换的,而曾经的所有向量与基底的关系保持不变,变的,只是向量本身的值,而不是向量和基底的关系。

所以考虑线性变换,我们其实只需要记住两个事情:

  1. 原始向量和原始基底的关系,这个关系会保持不变
  2. 基底的情况,这会随着线性变换而变

这两点注意好,无论你怎么变基底,都可以迅速推断出新向量的位置

实际上,对于二维来说,一个向量本身就是 ( i ^ , j ^ ) [ k 1 k 2 ] = k 1 i ^ + k 2 j ^ (\hat{i},\hat{j}) \begin{bmatrix} k_1\\k_2\end{bmatrix}=k_1\hat{i}+k_2\hat{j} (i^,j^)[k1k2]=k1i^+k2j^

( i ^ , j ^ ) (\hat{i},\hat{j}) (i^,j^)本身就是一个矩阵, [ 1 0 0 1 ] \begin{bmatrix} 1\ 0\\ 0\ 1 \end{bmatrix} [1 00 1]

可以直观地理解:

  1. 左边的矩阵,从左到右是n个基底
  2. 右边的向量代表向量和基底的关系,就是线性标出的系数
  3. 新的向量就是新的基底的线性组合,最后算出来的值,就是新的基底下,向量的值。
    • 新向量按照维度理解,则每一个维度,都是基底按照系数线性组合的结果

进一步总结:任何一个向量都等于基底乘以系数向量,包括最开始的i,j基底。

在这里插入图片描述

通过这个思路,就可以理解,旋转和剪切是如何实现的了。

在这里插入图片描述
在这里插入图片描述
如果新的基底在一条直线上,那么原有的二维空间就会被挤压到一维空间上,这就是降维了。

在这里插入图片描述

进一步理解矩阵和矩阵相乘。

如果说一个矩阵描述了新基底,那么另一个矩阵就是把基底再进行一次变换,两次基底的变换可以复合成一次性的线性变换。

所以矩阵乘,有两种理解:

  1. 把一个空间的每一个向量都变成新的向量,形成新的空间
  2. 把两个线性变换复合为一个线性变换

按照这个思路去理解,只要不影响从右到左的变换顺序,那么就不影响最终结果,所以矩阵乘具有结合和分配,但是没有交换运算。

在这里插入图片描述

行列式

因为是线性变换,所以对于基底向量构成的方格的面积变换,这个比例对于任何方格都是一样的。

即使一个形状不是方格,也可以用方格近似,所以任意面积,在经过线性变换以后,变换的比例是恒定的。

在这里插入图片描述

在这里插入图片描述

这个面积变换的比例,就是行列式。

为什么存在线性相关向量的矩阵,行列式=0呢?就是因为降维了,导致体积被压缩为0.1

当然,行列式也是有可能出现负值的,那代表什么呢?对于二维空间来说就是翻了个面,学术点就是改变了空间的定向,所谓定向,就是基底的相对位置(比如二维中,正定向是i永远在j左边,三维中,符合右手定则)

在这里插入图片描述

为什么把行列式的两行/两列交换后取值要加负号呢?就是因为交换会改变定向,相当于翻了个面。

在这里插入图片描述

在这里插入图片描述

具体要问行列式怎么计算,下图是二维情况。当然,这就是图一乐,实际上你不会这么去算的,就是理解一下,确实是面积的放大比例。

在这里插入图片描述

线性方程

我们先讨论非齐次线性方程。

其几何意义在于,寻找一个线性组合x,让这个向量经过基底A变换后,与v对齐

在这里插入图片描述
当然,这种情况是复杂的,线性变换后到底降没降维,可以用秩来描述。秩就是A张成的列空间的维度

如果r(A)<n,就代表降维了,自然det(A)=0

如果A的行列式不为0,也就是说A张成的空间可以把v覆盖,那么就有且只有一个x在变换后能和v重合。

这就是唯一解的条件:r(A)=n(或者行列式≠0),代表满秩,r(A,v)=r(A),代表A可以线性表出v。其实后一个条件压根没必要,只要满秩,A的空间维度一定可以覆盖v。

而且,因为是唯一解,具有一一映射的特性,所以可以通过逆映射,即一个逆向线性变换把v倒回x,这就是逆矩阵。

在这里插入图片描述
如果行列式=0,即r(A)< n,那么正向变换是降维的,也就是说会把空间压缩,但是你要知道,v是没有被压缩的,还是高维的,那么就有两种可能:

  1. v恰好落在降维后空间内,即v可以被A线性表出,即r(A)=r(A,b)
  2. v落在降维后空间外,即r(A)< r(A,b),此刻无解

在这里插入图片描述
如果在降维后,还有解的话,那么v这个位置其实是被压缩了无数个向量的

在这里插入图片描述

这不是一一映射,你自然无法把一条线逆向变回一个平面,所以det(A)=0时,没有逆矩阵。

从空间角度理解可逆变换的几何意义,就是不降维的变换。

非齐次说完了,说一下齐次吧。

其次就是v=0的特殊情况,0向量,无论被如何压缩,都可以落在空间之中,所以一定有解。

那么有一个解,还是无穷解,就取决于空间是否被压缩了,比如下面这条线被压缩为一个点的时候,无数个非零向量都被压缩为了0向量。

这就是齐次方程无穷非零解的情况,降维必无穷非零。

在这里插入图片描述

我们再来思考一下基础解系。你有想过为什么基础解系基底的数量是n-r(A)个吗?

以三维举例,如果只压缩1个维度,那么从空间上来说,就是沿着一条线把一个三维空间压扁。因此,只压缩一个维度,就会有一条线上的所有向量压缩为0向量,此时只需要1个基底就可以表示所有线性变换前的向量(解)

在这里插入图片描述
在这里插入图片描述

如果压缩2个维度呢?从空间来想象,就是沿着一个面的方向,把三维空间收缩成一束,想象一下你用拇指和食指套成一个圈儿,把很多线捏成一束的过程。

既然是沿着面,那么这整个面上的向量就都会被压缩为0向量,此时就需要用2个基底去表示这一个面上的解向量了。

在这里插入图片描述
在这里插入图片描述

最后,因为基础解系张成的子空间比较特殊,专门给起了个名字叫矩阵的“零空间”,或者“核”,还是比较形象的,压缩以后只剩一个点了,压缩前那不就是核心嘛。

基础解系就是零空间的基底。

非方阵

方阵代表同一个维度的空间之间的线性变换(不考虑降维情况)

如果是非方阵,就要考虑m和n了。n列代表输入空间是n维的,m代表输出空间是m维的。

什么意思呢?比如在二维空间中,向量在一个平面上,经过了3×2矩阵,变成了3维向量后,向量存在于空间。

然而这并不代表这个升维后的向量,就能脱离原有的平面,非方阵只是把原有平面抬升到更高维的空间,但是平面还是平面,只是倾斜了,正如一张纸上的线,放到空间中,还是一条线。

说白了,m>n的情况下,矩阵只是把原来n个低维基底,转移到了高维的空间中,基底仍然是n个

在这里插入图片描述
如果是2×3矩阵呢?代表了把3维空间压缩到2维空间,这个变换是很不舒服的,因为把3个基底放到了2维空间,很明显有一个基底就是冗余的了。

在这里插入图片描述
在这里插入图片描述

二维也可以压缩到一维,根据线性性质,平面上等距的点,压缩成数后,仍然等距。

在这里插入图片描述
在这里插入图片描述

点积

这一节比较难,我上来没听懂,关键在于那个对偶性,对偶性容易和对称混淆,其实完全没关系,要是我说的话,对偶性就是一种一一映射,是唯一等价关系。

点积的计算公式是把对应的坐标相乘,并把结果相加。另一种计算方法是,把一个向量投影到另一个向量上,模之积就是点积。这两个计算方法看起来毫无关系,他们的联系是什么呢?
在这里插入图片描述在这里插入图片描述

记住,我们的目标是发现点积,线性变换,投影的联系,现在讲引理。

我们前面说,线性变换可以把线性的空间变成线性的空间。

那么反过来,只要是把线性空间变成另一个线性空间,就一定有一个,且只有一个唯一的线性变换与之对应。

注意这个唯一性,即使是把二维空间压缩为数轴,不同的压缩方法,其放缩倍数都是不一样的,所以是新的线性空间对应唯一的线性变换。

引理说完了,先来寻找一下和单位向量点积是如何与投影联系起来的。

首先,投影是一个线性变换。把二维空间的向量,投影到一条直线上,很明显这是个线性过程,而且还是二维到一维的。

根据对偶性,只要是线性变换,就一定有一个1×2的矩阵与之对应,即投影矩阵。

在这里插入图片描述
投影矩阵到底是多少呢?按照线性变换的几何意义,我们只需要找到i,j两个向量在目标直线上的位置,也就是他们的值就行。

此时引入一个单位向量 u ^ \hat{u} u^,根据对称性,i在直线上的投影值(新基底),恰好等于u的x轴

在这里插入图片描述

这样,我们就用线性变换表示出了投影运算,这是几何上的联系。

从数值上来看,向量通过投影矩阵进行线性变换,投影到单位向量所在直线上的值,恰好等于向量和单位向量的点积。

在这里插入图片描述

投影——(几何)——线性变换——(数值)——点积

整个对于单位向量,证明思路就是这样。

非单位向量呢?

非单位向量只是单位向量的放缩,计算点积的结果仍然是数,整个过程仍然是从二维到一维,所以仍然对应一个投影矩阵。

只不过因为投影后基底要放缩,所以投影矩阵整体是要比单位向量情况放缩k倍的,这个矩阵可以理解为先投影,再缩放(乘以向量的模)。

至于点积和线性变换,仍然是数值上的联系。如此,投影和点积就彻底联系起来了。

总的来说,这个证明过程用到了线性变换与矩阵的唯一对应性,也就是对偶性。

对于n维变1维的情况,必然有一个n×1的矩阵可以表示这个线性变换,把这个矩阵转置成向量,我们也可以说,任意一个n维变1维的线性变换,一定有一个空间中的向量v与之相关,这就是点积和线性变换的等价性。

在这里插入图片描述

叉积

叉积结果的模,平行四边形的面积。

行列式的几何意义,恰好也是线性变换的放大倍数,就用叉积的两个向量当线性变换,计算行列式就等于叉积结果。

当然最后要定向,分正负。

在这里插入图片描述

实际上,叉积是一个向量,垂直于底面,模是底面积。叉积可以说是一个代表底面大小和方向的向量。

在这里插入图片描述

具体如何计算叉积呢?就是用行列式, 好啦,问题来了,行列式怎么和叉积的几何意义联系起来的呢?还是对偶性。

在这里插入图片描述

一个线性变换,可以等价于和对偶向量的点乘。

在这里插入图片描述
整体的计划如下:

  1. 首先通过v和w构造线性变换
  2. 然后求出对偶向量,这个对偶向量恰好就是叉积
  3. 而且这个求对偶向量的过程,恰好也就是通过行列式计算叉积的过程。

在这里插入图片描述

这是一个输入向量,输出值的函数,行列式计算结果代表平行六面体的体积,很明显这是个线性变换(行列式的特点就是这样)。

在这里插入图片描述

根据对偶性,自然有一个1×3的线性变换,进而根据可以变成和3维向量点积,这个三维向量恰好就是我们要的点积。

之所以叉积要用ijk去代替xyz,写成行列式的样子,其实原理就在于此,ijk只是告诉你,算完以后的p是一个向量。

在这里插入图片描述
我们到这里只是给出了p的公式,还没有解释为啥p的模就等于底面积。

还得从最开始,平行六面体的体积来看。设(x,y,z)向量为a。则V=底面积×高=a在p上的投影×p的模

你要注意,高=a在p上的投影,所以底面积就自然等于p的模了。

在这里插入图片描述

基变换

不同的坐标系(基底),对于同一个向量,其向量坐标值都是不一样的。

比如,在b1,b2这个坐标系中(称b空间),我们的向量坐标是 [ − 1 , 2 ] T [-1,2]^T [1,2]T,但是在原始的i,j坐标系中(称ij空间),向量坐标应该是 [ − 4 , 1 ] T [-4,1]^T [4,1]T

如何实现不同基底下,向量的变换呢?

其实就是线性变换。对 [ − 1 , 2 ] T [-1,2]^T [1,2]T这个向量应用线性变换,就可以得到线性变换后的坐标值。

在这里插入图片描述
怎么去理解这个线性变换的过程呢?这里就有一个矛盾的点:

  1. 线性变换的含义是把我们这个ij空间变成b空间
  2. 线性变换的实际作用是吧b空间里的向量坐标转换为ij空间的向量坐标

在这里插入图片描述

根本问题在于这里对线性变换产生了误解。

我们以前的线性变换,是给定ij空间下的向量,然后作用一个线性变换,变成b空间的向量。

现在呢?我们给的是b空间的向量,压根就不是ij空间的向量,所以这个线性变换起到的并不是线性变换的作用,只是把本应属于b空间但是被误以为在ij空间的向量,从ij空间变换到了b空间。

所以上面那两种解释,其实只是两种不同的理解:

  1. 给定ij空间向量,矩阵乘后,将其投射到b空间中,得到的是拉伸后的ij空间坐标
  2. 给定b空间向量,矩阵乘后,得到其实际在ij空间的坐标

无论用哪种理解方式,得到的结果都是b空间向量用ij空间基底表示出的坐标。

在这里插入图片描述

理解了正向过程,反过来也就好说了,把ij空间真正的向量坐标,再转化为b空间基底表示的向量坐标。

在不同基底下的坐标转换,理解了以后,来看一下对不同坐标进行线性变换应该怎么做。

首先你要明白,我们前面的矩阵,都是对ij空间的线性变换,如果要对非ij空间进行线性变换,是无法直接用矩阵的,人家的基向量就不是ij,我们的矩阵无法直接作用到人家的基向量上。

那么思路就应该是:

  1. 先把非ij空间变成ij空间
  2. 然后进行线性变换
  3. 再把ij空间还原为非ij空间

在这里插入图片描述

中间的M是任意的,针对ij空间的线性变换,左右两边只是负责基变换转换视角的。

在这里插入图片描述

特征向量与特征值

在线性变换中,大部分的向量,方向都偏离了原有的方向。

有一部分向量,方向不变,这个方向上的所有向量方向都不变,仅仅是被拉伸了,而且倍数是相同的。

这些向量都是特征向量,倍数就是特征值。

这种直线,不止有一条,每一条上都有上面这种特殊的性质,也就是说,一个线性变换的特征值可能有好几个。

在这里插入图片描述

这玩意有啥用呢?对特征向量来说,就把一个线性变换简化成伸缩,这就是其意义。

在实际生产中,特征向量也有用,比如给你一个3D旋转变换,矩阵是非常麻烦的,但是你可以找到特征向量,特征向量那条线恰好就是转轴,而且特征值=1.

在数学理论中,特征向量可以用来从另一个角度理解线性变换。之前,我们是把ij变换到新的基底,实现空间的变换,在这个过程中,ij可能旋转,拉伸,比较复杂。

实际上,特征向量的数量和基底数量是一样的,那么我们不去看基底,我们把特征向量拉伸 λ i \lambda_i λi倍,也可以让空间变成我们目标的空间,这样理解就脱离了坐标轴,还原了线性变换的本质。

特征向量的性质讨论完了,该说说怎么算了。

下面这个等式,刚开始学比较懵逼,现在理解起来就很直观了,就是把线性变换简化成拉伸了呗。

在这里插入图片描述
把等式变换一下,就可以得到一个线性齐次方程。要有非零解,就一定要降维,所以行列式就等于0。

在这里插入图片描述
实际上,如果你把 λ \lambda λ看做变量,你在调整这个值的时候,行列式的几何意义(面积),也在连续变化,当这个变量使得面积=0的时候,这个变量就是特征值。当然,这并不是单调的,所以有多个零点,n阶矩阵最多有n个特征值

在这里插入图片描述
在这里插入图片描述
有时候,n阶矩阵的特征值小于n个(考虑重根),那就一定有一些特征值算出了虚数。比如下面这个旋转变换,压根就没特征值,所以最后算出俩虚数。

在这里插入图片描述
另一种特殊情况是,剪切,特征向量恰好在基向量方向上。这样的结果就是,你会丢失一个特征值,重根对应的特征向量会分布在基向量方向上。

在这里插入图片描述

还有一种特殊情况,就是空间整体的拉伸,你把特征值带进去以后,左边的矩阵会变成0矩阵,那么任意向量就都是特征向量了。

在这里插入图片描述

最后来说一下对角矩阵,对角矩阵的几何意义是把对应方向上的基向量放大k倍,所以n个对角矩阵相乘其实就是放大 k n k^n kn倍。

除去那些堆特殊情况,大部分情况其实是n阶矩阵有n个特征值,那么如果用这n个特征向量作为新的基底,就是所谓的“特征基”。

用这个基底有个好处,就是复杂的线性变换可以被看做是单纯的基向量放大,所有向量仅仅是伸缩,没有旋转。

那如何用现有基底,去表示特征基下的伸缩变换呢?回顾上一节的基变换,我们先把特征基变成现有基底,然后应用伸缩,再变回特征基。

至于基变换矩阵怎么求,就是把特征基对应特征值排列起来构成矩阵,这也是我们线代里的基本做法。

为什么说这个矩阵就是基变换矩阵呢?有了这个矩阵,每个在特征基空间内的基,比如(1,0,0),经过特征矩阵变换后,就可以得到ij空间内的特征向量坐标,符合基变换的特征,所以我们这么构造是合理的。

在这里插入图片描述

其实这就是相似对角化,而相似对角化的条件,其实就等价于你有n个特征基。

抽象向量空间

通过基变换你可以发现,线性代数中的各种运算,其实和基坐标没有什么关系,无论你选什么基底,他们的运算都具有线性性质,我们那些规则也都适用:

线性性质:

  1. 可加性:先加在变换=先变换再加
  2. 成比例:先乘再变换=先变换再乘

在这里插入图片描述
我们前面描述的,二维情况下网格线密度均匀,那只是一种特例,真正的线性性质应该是上面这两条。

实际上,无论是向量,还是函数,还是什么过程,比如求导,微分,只要你是某种转换,而且具有线性性质,那么就可以给它找一组基,写成向量的形式,就可以应用线代的公式和特性。

以多项式举例,选择x的不同幂为基底,则构成了一个向量空间,每个基都是一个向量,只不过我们写成一个函数。

在这里插入图片描述

那么给一个多项式,就可以用向量坐标表示出来其在向量空间的位置了。

在这里插入图片描述

求导运算是线性变换,所以可以用矩阵表示。

在这里插入图片描述

在数学中,除了求导,还有更多的东西是线性变换,凡是线性变换,都可以写成基,矩阵,向量,并且应用线代计算法则。

在这里插入图片描述
发明线代的数学家,为了把这种规则推广到各个领域,就需要建立其他领域到线代领域的桥梁,即线性空间的判定。

向量是什么形式并不重要,只要你构造的向量空间只要满足8条公理,就证明这个写法是线性的,可以应用所有线代法则。

在这里插入图片描述

之所以我们讲的那么难,就是为了普适,但是普适的代价就是抽象,所以如果真的想学好,其实应该先从具象入手,然后推广到抽象,只是这样就费时间了,所以很矛盾,但是我仍然建议两者互为补充。

在这里插入图片描述

相关文章:

线性代数的本质笔记(3B1B课程)

文章目录 前言向量矩阵行列式线性方程非方阵点积叉积基变换特征向量与特征值抽象向量空间 前言 最近在复习线代&#xff0c;李永乐的基础课我刷了一下&#xff0c;感觉讲的不够透彻&#xff0c;和我当年学线代的感觉一样&#xff0c;就是不够形象。 比如&#xff0c;行列式为…...

快速掌握MQ消息中间件rabbitmq

快速掌握MQ消息中间件rabbitmq 目录概述需求&#xff1a; 设计思路实现思路分析1.video 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,c…...

Git push拦截

遇到的问题 今天想提交代码到gitee&#xff0c;结果发现被拦截了&#xff0c;有段提示“forbidden by xxxx”… 我记得xxxx好像是公司的一个防泄密的东西… 这个东西是怎么实现的呢&#xff1f; 解决 原来git提供很多hook&#xff0c;push命令就有一个pre-push的hook&#x…...

拼多多anti-token分析

前言&#xff1a;拼多多charles抓包分析发现跟商品相关的请求头里都带了一个anti-token的字段且每次都不一样,那么下面的操作就从分析anti-token开始了 1.jadx反编译直接搜索 选中跟http相关的类对这个方法进行打印堆栈 结合堆栈方法调用的情况找到具体anti-token是由拦截器类f…...

基于微信小程序的中医体质辨识文体活动的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于微信小程序的中医体质辨识文体活动的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java s…...

4.16 TCP 协议有什么缺陷?

目录 升级 TCP 的工作很困难 TCP 建立连接的延迟 TCP 存在队头阻塞问题 网络迁移需要重新建立 TCP 连接 升级 TCP 的工作很困难&#xff1b;TCP 建立连接的延迟&#xff1b;TCP 存在队头阻塞问题&#xff1b;网络迁移需要重新建立 TCP 连接&#xff1b; 升级 TCP 的工作很…...

VMware 修改ip地址 虚拟机静态ip设置 centos动态ip修改为静态ip地址 centos静态ip地址 vmware修改ip地址

虚拟机的centos服务器经常变换ip&#xff0c;测试起来有些麻烦&#xff0c;故将动态ip修改为静态ip 1. 查看vmware 虚拟机网络配置&#xff1a; 点击编辑&#xff0c;打开虚拟网络配置 2. 选中nat模式&#xff0c;点击nat设置&#xff0c;最终获取网关ip: 192.168.164.2 3. 进…...

Deepin添加Ubuntu源

升级Deepin V23后&#xff0c;无法安装Zeal了&#xff0c;后面发现可以通过ubuntu源来安装。参考了以下两个文档。 添加Ubuntu源1 添加Ubuntu源2 1.添加ubuntu.list sudo vim /etc/apt/sources.list.d/ubuntu.list 2.添加中科大Ubuntu源 deb http://mirrors.ustc.edu.cn/…...

Mysql的多表查询和索引

MySQL 多表查询 当两个表查询时&#xff0c;从第一张表中取出一行和第二张表的每一行进行组合 返回结果含有两张表的所有列&#xff0c;一共返回的记录数第一张表行数*第二张表的行数&#xff08;笛卡尔积&#xff09; -- ?显示雇员名,雇员工资及所在部门的名字 【笛卡尔集…...

Java设计模式之建造者模式

建造者模式&#xff0c;又称生成器模式&#xff1a;将一个复杂的构建与其表示相分离&#xff0c;使得同样的构建过程可以创建不同的表示。 三个角色&#xff1a;建造者、具体的建造者、监工、使用者 建造者角色&#xff1a;定义生成实例所需要的所有方法&#xff1b; 具体的建…...

H5商城公众号商城系统源码 积分兑换商城系统独立后台

网购商城系统源码 积分兑换商城系统源码 独立后台附教程 测试环境&#xff1a;NginxPHP7.0MySQL5.6thinkphp伪静态...

华为OD机试 - 完全数计算(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示六、纵览全局 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&…...

每日一学——Vlan配置

VLAN&#xff08;Virtual Local Area Network&#xff09;是虚拟局域网的缩写&#xff0c;它是一种将多台主机和网络设备逻辑上划分成不同的局域网的技术。VLAN的实施可以基于端口、MAC地址、协议等多种方式进行。 VLAN的主要功能包括&#xff1a; 分割网络&#xff1a;VLAN可…...

Pimpl模式

写在前面 Pimpl(Pointer to implementation&#xff0c;又称作“编译防火墙”) 是一种减少代码依赖和编译时间的C编程技巧&#xff0c;其基本思想是将一个外部可见类(visible class)的实现细节&#xff08;一般是所有私有的非虚成员&#xff09;放在一个单独的实现类(implemen…...

Python 密码破解指南:5~9

协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【OpenDocCN 饱和式翻译计划】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 收割 SB 的人会被 SB 们封神&#xff0c;试图唤醒 SB 的人是 SB 眼中的 SB。——SB 第三定律 五、凯…...

ARM驱动开发

驱动 以来内核编译&#xff0c;依赖内核执行 驱动可以同时执行多份代码 没main 驱动是依赖内核的框架和操作硬件的过程 一&#xff0c;Linux系统组成 app: [0-3G] ---------------------------------系统调用&#xff08;软中断…...

Matlab图像处理-加法运算

加法运算 图像加法运算的一个应用是将一幅图像的内容叠加到另一幅图像上&#xff0c;生成叠加图像效果&#xff0c;或给图像中每个像素叠加常数改变图像的亮度。 在MATLAB图像处理工具箱中提供的函数imadd()可实现两幅图像的相加或者一幅图像和常量的相加。 程序代码 I1 i…...

Docker容器学习:搭建自己专属的LAMP环境

目录 编写Dockerfile 1.文件内容需求&#xff1a; 2.值得注意的是centos6官方源已下线&#xff0c;所以需要切换centos-vault源&#xff01; 3.Dockerfile内容 4.进入到 lamp 开始构建镜像 推送镜像到私有仓库 1.把要上传的镜像打上合适的标签 2.登录harbor仓库 3.上传镜…...

问道管理:沪指弱势震荡跌0.38%,金融、地产等板块走弱,算力概念等活跃

21日早盘&#xff0c;沪指盘中弱势震荡下探&#xff0c;创业板指一度跌逾1%失守2100点&#xff1b;北向资金小幅净流出。 截至午间收盘&#xff0c;沪指跌0.38%报3120.18点&#xff0c;深成指跌0.24%&#xff0c;创业板指跌0.62%&#xff1b;两市算计成交4238亿元&#xff0c;…...

OpenWrt package - BuildPackage

一. 前言 该文章所涉及到的知识都来自OpenWrt Wiki官网。OpenWrt的软件编译模板系统使软件移植到OpenWrt变得非常简单&#xff0c;如果在一个典型的package目录下&#xff0c;我们可以发现3个东西&#xff1a;package/Makefile&#xff0c;package/patches&#xff0c;package/…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...