【数理知识】旋转矩阵的推导过程,基于向量的旋转来实现,同时解决欧式变换的非线性局限

news2024/11/23 23:57:23
序号内容
1【数理知识】自由度 degree of freedom 及自由度的计算方法
2【数理知识】刚体 rigid body 及刚体的运动
3【数理知识】刚体基本运动,平动,转动
4【数理知识】向量数乘,内积,外积,matlab代码实现
5【数理知识】协方差,随机变量的的协方差,随机变量分别是单个数字和向量时的协方差
6【数理知识】旋转矩阵的推导过程,基于向量的旋转来实现,同时解决欧式变换的非线性局限

文章目录

1. 点和向量的表示

点(Point):是空间中的基本元素,没有长度,没有体积。

假设在三维空间中有一点 a a a,其坐标可以表示为 [ x , y , z ] T \left[\begin{matrix}x, y, z\end{matrix}\right]^\text{T} [x,y,z]T

而把两个点连接起来就构成了向量。


向量(Vector):可以看成某点指向另一点的一个箭头,请不要把向量与它的坐标这两个概念混淆,一个向量是空间当中的一样东西,比如说向量 a ⃗ \vec{a} a 。这里 a ⃗ \vec{a} a 并不是和若干个实数相关联。只有当我们指定这个三维空间中的某个坐标系时,才可以谈论该向量在此坐标系下的坐标,也就是找到若干个实数对应这个向量。

向量 a ⃗ \vec{a} a 在线性空间基 [ e ⃗ 1 , e ⃗ 2 , e ⃗ 3 ] \left[\begin{matrix}\vec{e}_1, \vec{e}_2, \vec{e}_3\end{matrix}\right] [e 1,e 2,e 3] 下的坐标为 [ x , y , z ] T \left[\begin{matrix}x, y, z\end{matrix}\right]^\text{T} [x,y,z]T,那么存在以下公式

a ⃗ = [ e ⃗ 1 e ⃗ 2 e ⃗ 3 ] [ x y z ] = e ⃗ 1 x + e ⃗ 2 y + e ⃗ 3 z = x e ⃗ 1 + y e ⃗ 2 + z e ⃗ 3 \begin{aligned} \vec{a} = \left[\begin{matrix} \vec{e}_1 & \vec{e}_2 & \vec{e}_3 \end{matrix}\right] \left[\begin{matrix} x \\ y \\ z \\ \end{matrix}\right] = \vec{e}_1x + \vec{e}_2 y + \vec{e}_3 z \\ = x \vec{e}_1+ y \vec{e}_2 + z \vec{e}_3 \end{aligned} a =[e 1e 2e 3] xyz =e 1x+e 2y+e 3z=xe 1+ye 2+ze 3


2. 基于向量推导旋转矩阵 R R R

对于同一个向量 a ⃗ \vec{a} a ,设在单位正交基 [ e ⃗ 1 , e ⃗ 2 , e ⃗ 3 ] \left[\begin{matrix}\vec{e}_1, \vec{e}_2, \vec{e}_3\end{matrix}\right] [e 1,e 2,e 3] 下的坐标为 [ x , y , z ] T \left[\begin{matrix}x, y, z\end{matrix}\right]^\text{T} [x,y,z]T
经过一次旋转,单位正交基变成了 [ e ⃗ 1 ′ , e ⃗ 2 ′ , e ⃗ 3 ′ ] \left[\begin{matrix}\vec{e}_1^\prime, \vec{e}_2^\prime, \vec{e}_3^\prime\end{matrix}\right] [e 1,e 2,e 3],而向量 a ⃗ \vec{a} a 在新的正交基下的坐标为 [ x ′ , y ′ , z ′ ] T \left[\begin{matrix}x^\prime, y^\prime, z^\prime\end{matrix}\right]^\text{T} [x,y,z]T

由于该向量并没有随着坐标系的旋转而发生运动,因此根据坐标的定义,我们有

a ⃗ = [ e ⃗ 1 e ⃗ 2 e ⃗ 3 ] [ x y z ]   = [ e ⃗ 1 ′ e ⃗ 2 ′ e ⃗ 3 ′ ] [ x ′ y ′ z ′ ] \begin{aligned} \vec{a} &= \left[\begin{matrix} \vec{e}_1 & \vec{e}_2 & \vec{e}_3 \end{matrix}\right] \left[\begin{matrix} x \\ y \\ z \\ \end{matrix}\right]\ \\ &= \left[\begin{matrix} \vec{e}_1^\prime & \vec{e}_2^\prime & \vec{e}_3^\prime \end{matrix}\right] \left[\begin{matrix} x^\prime \\ y^\prime \\ z^\prime \\ \end{matrix}\right] \end{aligned} a =[e 1e 2e 3] xyz  =[e 1e 2e 3] xyz


假如在等式两边同时左乘矩阵 [ e ⃗ 1 T e ⃗ 2 T e ⃗ 3 T ] \left[\begin{matrix}\vec{e}_1^\text{T} \\ \vec{e}_2^\text{T} \\ \vec{e}_3^\text{T}\end{matrix}\right] e 1Te 2Te 3T ,有

[ e ⃗ 1 T e ⃗ 2 T e ⃗ 3 T ] [ e ⃗ 1 e ⃗ 2 e ⃗ 3 ] [ x y z ] = [ e ⃗ 1 T e ⃗ 2 T e ⃗ 3 T ] [ e ⃗ 1 ′ e ⃗ 2 ′ e ⃗ 3 ′ ] [ x ′ y ′ z ′ ] [ e ⃗ 1 T e ⃗ 1 e ⃗ 1 T e ⃗ 2 e ⃗ 1 T e ⃗ 3 e ⃗ 2 T e ⃗ 1 e ⃗ 2 T e ⃗ 2 e ⃗ 2 T e ⃗ 3 e ⃗ 3 T e ⃗ 1 e ⃗ 3 T e ⃗ 2 e ⃗ 3 T e ⃗ 3 ] [ x y z ] = [ e ⃗ 1 T e ⃗ 1 ′ e ⃗ 1 T e ⃗ 2 ′ e ⃗ 1 T e ⃗ 3 ′ e ⃗ 2 T e ⃗ 1 ′ e ⃗ 2 T e ⃗ 2 ′ e ⃗ 2 T e ⃗ 3 ′ e ⃗ 3 T e ⃗ 1 ′ e ⃗ 3 T e ⃗ 2 ′ e ⃗ 3 T e ⃗ 3 ′ ] [ x ′ y ′ z ′ ] \begin{aligned} \left[\begin{matrix} \vec{e}_1^\text{T} \\ \vec{e}_2^\text{T} \\ \vec{e}_3^\text{T} \\ \end{matrix}\right] \left[\begin{matrix} \vec{e}_1 & \vec{e}_2 & \vec{e}_3 \end{matrix}\right] \left[\begin{matrix} x \\ y \\ z \\ \end{matrix}\right] &= \left[\begin{matrix} \vec{e}_1^\text{T} \\ \vec{e}_2^\text{T} \\ \vec{e}_3^\text{T} \\ \end{matrix}\right] \left[\begin{matrix} \vec{e}_1^\prime & \vec{e}_2^\prime & \vec{e}_3^\prime \end{matrix}\right] \left[\begin{matrix} x^\prime \\ y^\prime \\ z^\prime \\ \end{matrix}\right] \\ \left[\begin{matrix} \vec{e}_1^\text{T} \vec{e}_1 & \vec{e}_1^\text{T} \vec{e}_2 & \vec{e}_1^\text{T} \vec{e}_3 \\ \vec{e}_2^\text{T} \vec{e}_1 & \vec{e}_2^\text{T} \vec{e}_2 & \vec{e}_2^\text{T} \vec{e}_3 \\ \vec{e}_3^\text{T} \vec{e}_1 & \vec{e}_3^\text{T} \vec{e}_2 & \vec{e}_3^\text{T} \vec{e}_3 \\ \end{matrix}\right] \left[\begin{matrix} x \\ y \\ z \\ \end{matrix}\right] &= \left[\begin{matrix} \vec{e}_1^\text{T} \vec{e}_1^\prime & \vec{e}_1^\text{T} \vec{e}_2^\prime & \vec{e}_1^\text{T} \vec{e}_3^\prime \\ \vec{e}_2^\text{T} \vec{e}_1^\prime & \vec{e}_2^\text{T} \vec{e}_2^\prime & \vec{e}_2^\text{T} \vec{e}_3^\prime \\ \vec{e}_3^\text{T} \vec{e}_1^\prime & \vec{e}_3^\text{T} \vec{e}_2^\prime & \vec{e}_3^\text{T} \vec{e}_3^\prime \\ \end{matrix}\right] \left[\begin{matrix} x^\prime \\ y^\prime \\ z^\prime \\ \end{matrix}\right] \end{aligned} e 1Te 2Te 3T [e 1e 2e 3] xyz e 1Te 1e 2Te 1e 3Te 1e 1Te 2e 2Te 2e 3Te 2e 1Te 3e 2Te 3e 3Te 3 xyz = e 1Te 2Te 3T [e 1e 2e 3] xyz = e 1Te 1e 2Te 1e 3Te 1e 1Te 2e 2Te 2e 3Te 2e 1Te 3e 2Te 3e 3Te 3 xyz

显而易见有

e ⃗ 1 T e ⃗ 1 = 1 , e ⃗ 1 T e ⃗ 2 = 0 , e ⃗ 1 T e ⃗ 3 = 0 , e ⃗ 2 T e ⃗ 1 = 0 , e ⃗ 2 T e ⃗ 2 = 1 , e ⃗ 2 T e ⃗ 3 = 0 , e ⃗ 3 T e ⃗ 1 = 0 , e ⃗ 3 T e ⃗ 2 = 0 , e ⃗ 3 T e ⃗ 3 = 1 , \begin{aligned} \vec{e}_1^\text{T} \vec{e}_1 = 1, \quad & \vec{e}_1^\text{T} \vec{e}_2 = 0, \quad & \vec{e}_1^\text{T} \vec{e}_3 = 0, \quad \\ \vec{e}_2^\text{T} \vec{e}_1 = 0, \quad & \vec{e}_2^\text{T} \vec{e}_2 = 1, \quad & \vec{e}_2^\text{T} \vec{e}_3 = 0, \quad \\ \vec{e}_3^\text{T} \vec{e}_1 = 0, \quad & \vec{e}_3^\text{T} \vec{e}_2 = 0, \quad & \vec{e}_3^\text{T} \vec{e}_3 = 1, \quad \\ \end{aligned} e 1Te 1=1,e 2Te 1=0,e 3Te 1=0,e 1Te 2=0,e 2Te 2=1,e 3Te 2=0,e 1Te 3=0,e 2Te 3=0,e 3Te 3=1,

因此,可进一步化简为

[ e ⃗ 1 T e ⃗ 1 e ⃗ 1 T e ⃗ 2 e ⃗ 1 T e ⃗ 3 e ⃗ 2 T e ⃗ 1 e ⃗ 2 T e ⃗ 2 e ⃗ 2 T e ⃗ 3 e ⃗ 3 T e ⃗ 1 e ⃗ 3 T e ⃗ 2 e ⃗ 3 T e ⃗ 3 ] [ x y z ] = [ e ⃗ 1 T e ⃗ 1 ′ e ⃗ 1 T e ⃗ 2 ′ e ⃗ 1 T e ⃗ 3 ′ e ⃗ 2 T e ⃗ 1 ′ e ⃗ 2 T e ⃗ 2 ′ e ⃗ 2 T e ⃗ 3 ′ e ⃗ 3 T e ⃗ 1 ′ e ⃗ 3 T e ⃗ 2 ′ e ⃗ 3 T e ⃗ 3 ′ ] [ x ′ y ′ z ′ ] [ x y z ] = [ e ⃗ 1 T e ⃗ 1 ′ e ⃗ 1 T e ⃗ 2 ′ e ⃗ 1 T e ⃗ 3 ′ e ⃗ 2 T e ⃗ 1 ′ e ⃗ 2 T e ⃗ 2 ′ e ⃗ 2 T e ⃗ 3 ′ e ⃗ 3 T e ⃗ 1 ′ e ⃗ 3 T e ⃗ 2 ′ e ⃗ 3 T e ⃗ 3 ′ ] [ x ′ y ′ z ′ ] = d e f R [ x ′ y ′ z ′ ] \begin{aligned} \left[\begin{matrix} \vec{e}_1^\text{T} \vec{e}_1 & \vec{e}_1^\text{T} \vec{e}_2 & \vec{e}_1^\text{T} \vec{e}_3 \\ \vec{e}_2^\text{T} \vec{e}_1 & \vec{e}_2^\text{T} \vec{e}_2 & \vec{e}_2^\text{T} \vec{e}_3 \\ \vec{e}_3^\text{T} \vec{e}_1 & \vec{e}_3^\text{T} \vec{e}_2 & \vec{e}_3^\text{T} \vec{e}_3 \\ \end{matrix}\right] \left[\begin{matrix} x \\ y \\ z \\ \end{matrix}\right] &= \left[\begin{matrix} \vec{e}_1^\text{T} \vec{e}_1^\prime & \vec{e}_1^\text{T} \vec{e}_2^\prime & \vec{e}_1^\text{T} \vec{e}_3^\prime \\ \vec{e}_2^\text{T} \vec{e}_1^\prime & \vec{e}_2^\text{T} \vec{e}_2^\prime & \vec{e}_2^\text{T} \vec{e}_3^\prime \\ \vec{e}_3^\text{T} \vec{e}_1^\prime & \vec{e}_3^\text{T} \vec{e}_2^\prime & \vec{e}_3^\text{T} \vec{e}_3^\prime \\ \end{matrix}\right] \left[\begin{matrix} x^\prime \\ y^\prime \\ z^\prime \\ \end{matrix}\right] \\ \left[\begin{matrix} x \\ y \\ z \\ \end{matrix}\right] &= \left[\begin{matrix} \vec{e}_1^\text{T} \vec{e}_1^\prime & \vec{e}_1^\text{T} \vec{e}_2^\prime & \vec{e}_1^\text{T} \vec{e}_3^\prime \\ \vec{e}_2^\text{T} \vec{e}_1^\prime & \vec{e}_2^\text{T} \vec{e}_2^\prime & \vec{e}_2^\text{T} \vec{e}_3^\prime \\ \vec{e}_3^\text{T} \vec{e}_1^\prime & \vec{e}_3^\text{T} \vec{e}_2^\prime & \vec{e}_3^\text{T} \vec{e}_3^\prime \\ \end{matrix}\right] \left[\begin{matrix} x^\prime \\ y^\prime \\ z^\prime \\ \end{matrix}\right] \\ & \overset{def}{=} R \left[\begin{matrix} x^\prime \\ y^\prime \\ z^\prime \\ \end{matrix}\right] \end{aligned} e 1Te 1e 2Te 1e 3Te 1e 1Te 2e 2Te 2e 3Te 2e 1Te 3e 2Te 3e 3Te 3 xyz xyz = e 1Te 1e 2Te 1e 3Te 1e 1Te 2e 2Te 2e 3Te 2e 1Te 3e 2Te 3e 3Te 3 xyz = e 1Te 1e 2Te 1e 3Te 1e 1Te 2e 2Te 2e 3Te 2e 1Te 3e 2Te 3e 3Te 3 xyz =defR xyz

这个 R R R 描述了向量的旋转,称为旋转矩阵(Rotation Matrix)。


上述推导过程是基于向量的代数关系来的,还有使用三维坐标轴旋转角度的推导过程,可以参考文章:第3章-数理知识基础 -> 坐标转换。


旋转矩阵 R R R 有性质:

  • 旋转矩阵 R R R 是一个行列式为 1 的正交矩阵。反之,行列式为 1 的正交矩阵也是一个旋转矩阵。所有 n n n 维旋转矩阵构成特殊正交群 S O ( n ) SO(n) SO(n) S O ( n ) = { R ∈ R n × n ∣ R R T = I , det ( R ) = I } SO(n) = \{ R \in \R^{n \times n} | RR^\text{T} = I, \text{det}(R) = I \} SO(n)={RRn×nRRT=I,det(R)=I}

  • 旋转矩阵 R R R 是正交矩阵(Orthogonal Matrix,正交矩阵即逆为自身转置的矩阵),旋转矩阵的逆 R − 1 R^{-1} R1 描述了一个相反的旋转


3. 向量的欧式变换

在计算机视觉和机器人技术中,欧式变换(Euclidean/Rigid Translation,或称为刚性变换)是一种非常常见的变换。

欧式变换包括两个部分:

  1. 旋转:它可以通过旋转矩阵来表示。
  2. 平移:它可以通过平移向量来表示。

不清楚的可以参考文章:【数理知识】刚体基本运动,平动,转动。

假设有如下旋转和平移过程:世界坐标系中存在一个向量 a ⃗ 1 \vec{a}_1 a 1,经过一次旋转 R 1 t 2 R_{1t2} R1t2 和一次平移 t 1 t 2 t_{1t2} t1t2 后,得到了向量 a ⃗ 2 \vec{a}_2 a 2,那么有如下关系
a ⃗ 2 = R 1 t 2 a ⃗ 1 + t 1 t 2 \vec{a}_2 = R_{1t2} \vec{a}_1 + t_{1t2} a 2=R1t2a 1+t1t2


4. 欧式变换具有非线性的局限性

欧式变换是刚性变换,它包括了旋转和平移。虽然平移是线性的,但旋转却是非线性的。

对于旋转,我们可以使用旋转矩阵、四元数或旋转轴和旋转角来描述。不论是哪种描述方式,旋转的性质都是非线性的。

假如我们进行两次变换: R 1 t 2 , t 1 t 2 R_{1t2}, t_{1t2} R1t2,t1t2 R 2 t 3 , t 2 t 3 R_{2t3}, t_{2t3} R2t3,t2t3

a ⃗ 2 = R 1 t 2 a ⃗ 1 + t 1 t 2 a ⃗ 3 = R 2 t 3 a ⃗ 2 + t 2 t 3 = R 2 t 3 ( R 1 t 2 a ⃗ 1 + t 1 t 2 ) + t 2 t 3 \begin{aligned} \vec{a}_2 &= R_{1t2} \vec{a}_1 + t_{1t2} \\ \vec{a}_3 &= R_{2t3} \vec{a}_2 + t_{2t3} \\ &= R_{2t3} (R_{1t2} \vec{a}_1 + t_{1t2}) + t_{2t3} \end{aligned} a 2a 3=R1t2a 1+t1t2=R2t3a 2+t2t3=R2t3(R1t2a 1+t1t2)+t2t3

上述变换里有两个旋转矩阵,但是两次旋转的组合 R 2 t 3 × R 1 t 2 R_{2t3} \times R_{1t2} R2t3×R1t2不等于两个旋转矩阵的简单线性组合,比如说加法。

同理,如果我们使用四元数来描述旋转,四元数的乘法也是非线性的。


5. 使用变换矩阵 T T T 解决非线性

针对欧式变换的非线性问题,我们可以通过齐次坐标(Homogeneous Coordinates)的方法进行解决。

齐次坐标通过添加一个额外的坐标来扩展标准坐标。可以用单个矩阵表示旋转和平移,使得变换更简单。


具体解决办法是通过向三维向量的末尾添加 1,将其变为一个四维向量,称为齐次坐标。针对此欧式变换

a ⃗ 2 = R 1 t 2 a ⃗ 1 + t 1 t 2 \vec{a}_2 = R_{1t2} \vec{a}_1 + t_{1t2} a 2=R1t2a 1+t1t2

将旋转矩阵和平移向量写进同一个变换矩阵(Transformation Matrix)中,同时扩张维度后为

[ a ⃗ 2 1 ] = [ R 1 t 2 t 1 t 2 0 1 × 3 1 ] [ a ⃗ 1 1 ] = T [ a ⃗ 1 1 ] \begin{aligned} \left[\begin{matrix} \vec{a}_2 \\ 1 \end{matrix}\right] &= \left[\begin{matrix} R_{1t2} & t_{1t2} \\ 0_{1 \times 3} & 1 \\ \end{matrix}\right] \left[\begin{matrix} \vec{a}_1 \\ 1 \\ \end{matrix}\right] \\ &= T \left[\begin{matrix} \vec{a}_1 \\ 1 \\ \end{matrix}\right] \end{aligned} [a 21]=[R1t201×3t1t21][a 11]=T[a 11]

T T T 即为变换矩阵。

在这里插入图片描述


齐次坐标的意义就在于将欧式变换表示为线性关系。

因此欧式变换变成齐次坐标后有

a ⃗ 2 = R 1 t 2 a ⃗ 1 + t 1 t 2 [ a ⃗ 2 1 ] = T [ a ⃗ 1 1 ] \begin{aligned} \vec{a}_2 &= R_{1t2} \vec{a}_1 + t_{1t2} \\ \left[\begin{matrix} \vec{a}_2 \\ 1 \end{matrix}\right] &= T \left[\begin{matrix} \vec{a}_1 \\ 1 \\ \end{matrix}\right]\end{aligned} a 2[a 21]=R1t2a 1+t1t2=T[a 11]


变换矩阵 T T T 的性质:

  • 变换矩阵 T T T 构成特殊欧式群 S E SE SE
    S E ( 3 ) = { T = [ R t 0 1 × 3 1 ] ∈ R 4 × 4 ∣ R ∈ S O ( 3 ) , t ∈ R 3 } SE(3) = \{ T = \left[\begin{matrix} R & t \\ 0_{1\times3} & 1 \\ \end{matrix}\right] \in \R^{4\times4} | R \in SO(3), t \in \R^3 \} SE(3)={T=[R01×3t1]R4×4RSO(3),tR3}

  • 变换矩阵的逆表示一个反向的变换:
    T − 1 = [ R T − R T t 0 1 × 3 1 ] T^{-1} = \left[\begin{matrix} R^\text{T} & -R^\text{T} t \\ 0_{1\times3} & 1 \\ \end{matrix}\right] T1=[RT01×3RTt1]


Ref

  1. 《视觉SLAM十四讲从理论到实践》第3讲 三维空间刚体运动 - 知乎
  2. SLAM学习笔记(一)第三讲三维空间刚体运动

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

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

相关文章

WGS_1984_UTM、WGS_1984_Mercator坐标转化为经纬度坐标python

1、遥感影像的PROJECTION有哪些 遥感影像常见的投影类型有很多,具体选择哪种投影方式取决于数据的特性和使用需求。以下列举了一些常见的遥感影像投影类型: UTM (Universal Transverse Mercator) 投影:最常见的投影类型之一,将地…

[原创]从强化学习的本质推导到PPO

前言 这篇博客很久之前就想做了,一直在拖是因为觉得自己对知识点理解还没有足够的透彻。但是每当去复盘基本概念的时候又很难理清逻辑,所以觉得即便现在半吊子水平,但是也想通过博客记录一下自己肤浅的学习心得,权当是为自己巩固…

ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决

ParallelCollectionRDD [0] isEmpty at KyuubiSparkUtil.scala:48问题解决 这个问题出现在使用Kyubi Spark Util处理ParallelCollectionRDD的过程中,具体是在KyubiSparkUtil.scala文件的第48行调用isEmpty方法时出现的。该问题可能是由以下几个原因引起的&#xff1…

C语言文件操作笔记

目录 1.文件 1.1 文件名 1.2 文件类型 1.3 文件缓冲区 1.4 文件指针 1.5 文件的打开和关闭 1.6 文件的顺序读写 1.6.1 fputc():向指定的文件中写入一个字符 1.6.2 fgetc():从指定的文件中读取一个字符 1.6.3 fgets():从指定的流 stream 读取一行 1.6.4 puts():向标准…

华为发布数字资产继承功能

在华为开发者大会2023(HDC.Together)上,华为常务董事、终端BG CEO、智能汽车解决方案BU CEO余承东正式发布了数字资产继承功能,HarmonyOS提供了安全便捷的数字资产继承路径。 在鸿蒙世界中,我们每个人在每台设备、应用…

开箱报告,Simulink Toolbox库模块使用指南(二)——MATLAB Fuction模块

文章目录 前言 MATLAB Fuction模块 采样点设置 FFT 求解 分析和应用 总结 前言 见《开箱报告,Simulink Toolbox库模块使用指南(一)——powergui模块》 MATLAB Fuction模块 MATLAB Fuction模块是在Simulink建模仿真或生成代码时&#x…

扩散模型实战(三):扩散模型的应用

推荐阅读列表: 扩散模型实战(一):基本原理介绍 扩散模型实战(二):扩散模型的发展 扩散只是一种思想,扩散模型也并非固定的深度网络结构。除此之外,如果将扩散的思想融入…

【并发编程】无锁环形队列Disruptor并发框架使用

Disruptor 是苹国外厂本易公司LMAX开发的一个高件能列,研发的初夷是解决内存队列的延识问顾在性能测试中发现竟然与10操作处于同样的数量级),基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCn演讲后,获得了业界关注…

软件单元测试

单元测试目的和意义 对于非正式的软件(其特点是功能比较少,后续也不有新特性加入,不用负责维护),我们可以使用debug单步执行,内存修改,检查对应的观测点是否符合要求来进行单元测试&#xff0c…

操作指南 | 如何使用Chainlink喂价功能获取价格数据

Chainlink的去中心化预言机网络中的智能合约包含由运行商为其他智能合约(DApps)使用或截取所持续更新的实施价格数据。其中有两个主要架构:喂价和基础要求模型。此教程将会展现如何在Moonbeam、Moonriver或是Moonbase Alpha测试网上使用喂价功…

使用一个python脚本抓取大量网站【1/3】

一、说明 您是否曾经想过抓取网站,但又不想为像Octoparse这样的抓取工具付费?或者,也许您只需要从网站上抓取几页,并且不想经历设置抓取脚本的麻烦。在这篇博文中,我将向您展示我如何创建一个工具,该工具能…

2023爱分析·信创云市场厂商评估报告:中国电子云

01 研究范围定义 信创2.0时代开启,信创进程正在从局部到全面、从细分到所有领域延展。在这个过程中,传统的系统集成,也在逐步向信创化、数字化及智能化转变。随着信创产业的发展,企业需要更多的技术支持和服务,而传统的系统集成已…

Laravel 框架资源嵌套.浅嵌套.自定义表单伪造.CSRF 保护 ④

![请添加图片描述](https://img-blog.csdnimg.cn/154d035aa4db42df99f3b01fbf287e46.gif#pic_center)作者 : SYFStrive 博客首页 : HomePage 📜: THINK PHP 📌:个人社区(欢迎大佬们加入) 👉&a…

暗黑版GPT流窜暗网 降低犯罪门槛

随着AIGC应用的普及,不法分子利用AI技术犯罪的手段越来越高明,欺骗、敲诈、勒索也开始与人工智能沾边。 近期,专为网络犯罪设计的“暗黑版GPT”持续浮出水面,它们不仅没有任何道德界限,更没有使用门槛,没有…

【Linux命令行与Shell脚本编程】第十六章 Shell函数

Linux命令行与Shell脚本编程 第一章 文章目录 Linux命令行与Shell脚本编程六.函数6.1.脚本函数基础6.1.1.创建函数6.1.2.使用函数 6.2.函数返回值6.2.1.默认的退出状态码6.2.2.使用return命令6.2.3.使用函数输出 6.3.函数中使用变量6.3.1.向函数传递参数6.3.2.在函数中处理变量…

【jvm】jvm整体结构(hotspot)

目录 一、说明二、java代码的执行流程三、jvm的架构模型3.1 基于栈式架构的特点3.2 基于寄存器架构的特点 一、说明 1.hotspot vm是目前市场上高性能虚拟机的代表作之一 2.hotspot采用解释器与即时编译器并存的架构 3.java虚拟机是用来解释运行字节码文件的,入口是字…

微服务技术栈(1.0)

微服务技术栈 认识微服务 单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署 优点: 架构简单部署成本低 缺点: 耦合度高 分布式架构 分布式架构:根据业务功能对系统进行拆分&#xff0c…

深度学习和OpenCV的对象检测(MobileNet SSD图像识别)

基于深度学习的对象检测时,我们主要分享以下三种主要的对象检测方法: Faster R-CNN(后期会来学习分享)你只看一次(YOLO,最新版本YOLO3,后期我们会分享)单发探测器(SSD,本节介绍,若你的电脑配置比较低,此方法比较适合R-CNN是使用深度学习进行物体检测的训练模型; 然而,…

新西兰跨境电商购物网站多语言翻译系统快速开发

搭建一个新西兰跨境电商购物网站的多语言翻译系统,可以按照以下步骤进行快速开发: 步骤1:确定需求和目标 首先,你需要明确你的网站需要支持哪些语言,并确定你想要实现的多语言翻译系统的具体功能和目标。 步骤2&…

unity如何手动更改脚本执行顺序

在Unity中,脚本的执行顺序是由脚本的执行顺序属性决定的。默认情况下,Unity根据脚本在项目中的加载顺序来确定它们的执行顺序。然而,你可以手动更改脚本的执行顺序,以下是一种方法: 在Unity编辑器中,选择你…