精华内容
下载资源
问答
  • 2022-06-17 20:57:58

    目的:最近在写优化代码,需要对函数中的变量求导,以及求得它们的雅克比矩阵。因此用到向量以及矩阵的求导。

    一个向量可以表示为如下: Y = [ y 1 , y 2 , . . . , y m ] T Y=[y_1,y_2,...,y_m]^T Y=[y1,y2,...,ym]T
    向量导数的基本知识。它分为以下几类:
    1)向量 Y = [ y 1 , y 2 , . . . , y m ] T Y=[y_1,y_2,...,y_m]^T Y=[y1,y2,...,ym]T x x x标量求导:
    ∂ Y ∂ x = [ ∂ y 1 ∂ x ∂ y 2 ∂ x ⋮ ∂ y m ∂ x ] \cfrac{\partial{Y}}{\partial{x}}=\begin{bmatrix} \cfrac{\partial{y_1}}{\partial{x}} \\ \cfrac{\partial{y_2}}{\partial{x}} \\ \vdots \\ \cfrac{\partial{y_m}}{\partial{x}} \end{bmatrix} xY=xy1xy2xym
    如果 Y = [ y 1 , y 2 , . . . , y m ] Y=[y_1,y_2,...,y_m] Y=[y1,y2,...,ym]是行向量,则求导
    ∂ Y ∂ x = [ ∂ y 1 ∂ x   ∂ y 2 ∂ x … ∂ y m ∂ x ] \cfrac{\partial{Y}}{\partial{x}}=\begin{bmatrix} \cfrac{\partial{y_1}}{\partial{x}} \space \cfrac{\partial{y_2}}{\partial{x}} \ldots \cfrac{\partial{y_m}}{\partial{x}} \end{bmatrix} xY=[xy1 xy2xym]

    2)标量 y y y对向量 X = [ x 1 , x 2 , . . . , x m ] T X=[x_1,x_2,...,x_m]^T X=[x1,x2,...,xm]T求导
    ∂ y ∂ X = [ ∂ y ∂ x 1 ∂ y ∂ x 2 ⋮ ∂ y ∂ x m ] \cfrac{\partial{y}}{\partial{X}}=\begin{bmatrix} \cfrac{\partial{y}}{\partial{x_1}} \\ \cfrac{\partial{y}}{\partial{x_2}} \\ \vdots \\ \cfrac{\partial{y}}{\partial{x_m}} \end{bmatrix} Xy=x1yx2yxmy
    如果 X = [ x 1 , x 2 , . . . , x m ] X=[x_1,x_2,...,x_m] X=[x1,x2,...,xm]为行向量:
    ∂ y ∂ X = [ ∂ y ∂ x 1   ∂ y ∂ x 2 … ∂ y ∂ x m ] \cfrac{\partial{y}}{\partial{X}}=\begin{bmatrix} \cfrac{\partial{y}}{\partial{x_1}} \space \cfrac{\partial{y}}{\partial{x_2}} \ldots \cfrac{\partial{y}}{\partial{x_m}} \end{bmatrix} Xy=[x1y x2yxmy]

    3)向量 Y = [ y 1 , y 2 , . . . , y m ] T Y=[y_1,y_2,...,y_m]^T Y=[y1,y2,...,ym]T对向量 X = [ x 1 , x 2 , . . . , x n ] X=[x_1,x_2,...,x_n] X=[x1,x2,...,xn]求导
    ∂ 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 m ∂ x 1    ∂ y m ∂ x 2    …    ∂ y m ∂ x n ] \cfrac{\partial{Y}}{\partial{X}}=\begin{bmatrix} \cfrac{\partial{y_1}}{\partial{x_1}} \space \space \cfrac{\partial{y_1}}{\partial{x_2}} \space \space \ldots \space \space \cfrac{\partial{y_1}}{\partial{x_n}} \\ \cfrac{\partial{y_2}}{\partial{x_1}} \space \space \cfrac{\partial{y_2}}{\partial{x_2}} \space \space \ldots \space \space \cfrac{\partial{y_2}}{\partial{x_n}} \\ \vdots \\ \cfrac{\partial{y_m}}{\partial{x_1}} \space \space \cfrac{\partial{y_m}}{\partial{x_2}} \space \space \ldots \space \space \cfrac{\partial{y_m}}{\partial{x_n}} \end{bmatrix} XY=x1y1  x2y1    xny1x1y2  x2y2    xny2x1ym  x2ym    xnym
    向量对向量求导也是所谓的雅克比矩阵,它在优化中非常见。

    如果是矩阵的话,
    Y Y Y是矩阵的时候,它的表达:
    Y = [ y 11    y 12    …    y 1 n y 21    y 22    …    y 2 n ⋮ y m 1    y m 2    …    y m n ] Y=\begin{bmatrix} y_{11} \space \space y_{12} \space \space \ldots \space \space y_{1n} \\ y_{21} \space \space y_{22} \space \space \ldots \space \space y_{2n} \\ \vdots \\ y_{m1} \space \space y_{m2} \space \space \ldots \space \space y_{mn} \end{bmatrix} Y=y11  y12    y1ny21  y22    y2nym1  ym2    ymn
    X X X是矩阵的时候,它的表达:
    X = [ x 11    x 12    …    x 1 n x 21    x 22    …    x 2 n ⋮ x m 1    x m 2    …    x m n ] X=\begin{bmatrix} x_{11} \space \space x_{12} \space \space \ldots \space \space x_{1n} \\ x_{21} \space \space x_{22} \space \space \ldots \space \space x_{2n} \\ \vdots \\ x_{m1} \space \space x_{m2} \space \space \ldots \space \space x_{mn} \end{bmatrix} X=x11  x12    x1nx21  x22    x2nxm1  xm2    xmn

    矩阵的导数有两种,如下
    1)矩阵 Y Y Y对标量 x x x求导:
    ∂ Y ∂ x = [ ∂ y 11 ∂ x    ∂ y 12 ∂ x    …    ∂ y 1 n ∂ x ∂ y 21 ∂ x    ∂ y 22 ∂ x    …    ∂ y 2 n ∂ x ⋮ ∂ y m 1 ∂ x    ∂ y m 2 ∂ x    …    ∂ y m n ∂ x ] \cfrac{\partial{Y}}{\partial{x}}=\begin{bmatrix} \cfrac{\partial{y_{11}}}{\partial{x}} \space \space \cfrac{\partial{y_{12}}}{\partial{x}} \space \space \ldots \space \space \cfrac{\partial{y_{1n}}}{\partial{x}} \\ \cfrac{\partial{y_{21}}}{\partial{x}} \space \space \cfrac{\partial{y_{22}}}{\partial{x}} \space \space \ldots \space \space \cfrac{\partial{y_{2n}}}{\partial{x}} \\ \vdots \\ \cfrac{\partial{y_{m1}}}{\partial{x}} \space \space \cfrac{\partial{y_{m2}}}{\partial{x}} \space \space \ldots \space \space \cfrac{\partial{y_{mn}}}{\partial{x}} \end{bmatrix} xY=xy11  xy12    xy1nxy21  xy22    xy2nxym1  xym2    xymn
    2)标量 y y y对矩阵 X X X求导:
    ∂ y ∂ X = [ ∂ y ∂ x 11    ∂ y ∂ x 12    …    ∂ y ∂ x 1 n ∂ y ∂ x 21    ∂ y ∂ x 22    …    ∂ y ∂ x 2 n ⋮ ∂ y ∂ x m 1    ∂ y ∂ x m 2    …    ∂ y ∂ x m n ] \cfrac{\partial{y}}{\partial{X}}=\begin{bmatrix} \cfrac{\partial{y}}{\partial{x_{11}}} \space \space \cfrac{\partial{y}}{\partial{x_{12}}} \space \space \ldots \space \space \cfrac{\partial{y}}{\partial{x_{1n}}} \\ \cfrac{\partial{y}}{\partial{x_{21}}} \space \space \cfrac{\partial{y}}{\partial{x_{22}}} \space \space \ldots \space \space \cfrac{\partial{y}}{\partial{x_{2n}}} \\ \vdots \\ \cfrac{\partial{y}}{\partial{x_{m1}}} \space \space \cfrac{\partial{y}}{\partial{x_{m2}}} \space \space \ldots \space \space \cfrac{\partial{y}}{\partial{x_{mn}}} \end{bmatrix} Xy=x11y  x12y    x1nyx21y  x22y    x2nyxm1y  xm2y    xmny
    这是基本的向量的导数定义。基于这些定义以及一些基本的运算法则,得到一些组合的公式。在几何算法的编程中非常有用。

    公式中的向量求导,在一般公式中会多个向量以及向量依赖,因此,在求导数的时候希望它能满足标量求导的链式法则。
    假设向量相互依赖的关系为: U − > V − > W U->V->W U>V>W
    则偏导数为:
    ∂ W ∂ U = ∂ W ∂ V    ∂ V ∂ U \cfrac{\partial{W}}{\partial{U}}=\cfrac{\partial{W}}{\partial{V}} \space \space \cfrac{\partial{V}}{\partial{U}} UW=VW  UV

    证明:只需要拆开逐一对元素求导得到:
    ∂ w i ∂ u j = ∑ k ∂ w i ∂ v k   ∂ v k ∂ u j = ∂ w i ∂ V   ∂ V ∂ u j \cfrac{\partial{w_i}}{\partial{u_j}} = \sum_{k}\cfrac{\partial{w_i}}{\partial{v_k}}\space \cfrac{\partial{v_k}}{\partial{u_j}} =\cfrac{\partial{w_i}}{\partial{V}} \space \cfrac{\partial{V}}{\partial{u_j}} ujwi=kvkwi ujvk=Vwi ujV
    由此可见 ∂ w i ∂ u j \cfrac{\partial{w_i}}{\partial{u_j}} ujwi是等于矩阵 ∂ W ∂ V \cfrac{\partial{W}}{\partial{V}} VW i i i行和矩阵 ∂ V ∂ U \cfrac{\partial{V}}{\partial{U}} UV的第 j j j列的内积,这是矩阵的乘法定义。
    它很容易能推广到多层中间变量的情景。

    在变量中遇到的情况是常常公式为 F F F为一个实数,中间变量都是向量的时候,它的依赖为:
    X − > V − > U − > f X->V->U->f X>V>U>f
    根据雅克比矩阵的传递性可以得到如下:
    ∂ F ∂ X = ∂ F ∂ U   ∂ U ∂ V   ∂ V ∂ X \cfrac{\partial{F}}{\partial{X}} = \cfrac{\partial{F}}{\partial{U}}\space \cfrac{\partial{U}}{\partial{V}} \space \cfrac{\partial{V}}{\partial{X}} XF=UF VU XV
    因为 f f f为标量,因此它写成如下形式:
    ∂ f ∂ X T = ∂ f ∂ U T   ∂ U ∂ V   ∂ V ∂ X \cfrac{\partial{f}}{\partial{X^T}} = \cfrac{\partial{f}}{\partial{U^T}}\space \cfrac{\partial{U}}{\partial{V}} \space \cfrac{\partial{V}}{\partial{X}} XTf=UTf VU XV
    为了便于计算,上述需要转为行向量 U T U^T UT, X T X^T XT计算。这个非常重要。

    下面介绍向量求倒数的时候遇到的常用的运算公式,它们有以下两类

    1)两向量 U U U, V V V(列向量)点积的结果对 W W W求导:
    ∂ ( U T ⋅ V ) ∂ W = ( ∂ U ∂ W ) T ⋅ V + ( ∂ V ∂ W ) T ⋅ U   ( 4 ) \cfrac{\partial{(U^T \cdot V)}}{\partial{W}} = ( \cfrac{\partial{U}}{\partial{W}})^T \cdot V + ( \cfrac{\partial{V}}{\partial{W}})^T \cdot U \space (4) W(UTV)=(WU)TV+(WV)TU (4)
    点积的导数公式证明后续补上。
    证明:假设 U = [ u 0 u 1 u 3 ] U=\begin{bmatrix} u_0 \\ u_1 \\ u_3 \end{bmatrix} U=u0u1u3 V = [ v 0 v 1 v 3 ] V=\begin{bmatrix} v_0 \\ v_1 \\ v_3 \end{bmatrix} V=v0v1v3 ,它们为三维向量。得到点乘为 f = U T ⋅ V f=U^T \cdot V f=UTV,它是一个标量为: f = u 0 v 0 + u 1 v 1 + u 2 v 2 f=u_0v_0+u_1v_1+u_2v_2 f=u0v0+u1v1+u2v2,然后求它对 W W W的导数

    ∂ f ∂ W = ∂ ( u 0 v 0 + u 1 v 1 + u 2 v 2 ) ∂ W = ∂ u 0 ∂ W v 0 + ∂ v 0 ∂ W u 0 + ∂ u 1 ∂ W v 1 + ∂ v 1 ∂ W u 1 + ∂ u 2 ∂ W v 2 + ∂ v 2 ∂ W u 2 = ( ∂ u 0 ∂ W v 0 + ∂ u 1 ∂ W v 1 + ∂ u 2 ∂ W v 2 ) + ( ∂ v 0 ∂ W u 0 + ∂ v 1 ∂ W u 1 + ∂ v 2 ∂ W u 2 ) = ( ∂ U ∂ W ) T ⋅ V + ( ∂ V ∂ W ) T ⋅ U \cfrac{\partial{f}}{\partial{W}}=\cfrac{\partial{(u_0v_0+u_1v_1+u_2v_2)}}{\partial{W}} \\ =\cfrac{\partial{u_0}}{\partial{W}}v_0 + \cfrac{\partial{v_0}}{\partial{W}}u_0 + \cfrac{\partial{u_1}}{\partial{W}}v_1 + \cfrac{\partial{v_1}}{\partial{W}}u_1 + \cfrac{\partial{u_2}}{\partial{W}}v_2 + \cfrac{\partial{v_2}}{\partial{W}}u_2 \\ =(\cfrac{\partial{u_0}}{\partial{W}}v_0 + \cfrac{\partial{u_1}}{\partial{W}}v_1 + \cfrac{\partial{u_2}}{\partial{W}}v_2) + (\cfrac{\partial{v_0}}{\partial{W}}u_0 + \cfrac{\partial{v_1}}{\partial{W}}u_1 + \cfrac{\partial{v_2}}{\partial{W}}u_2) \\ =( \cfrac{\partial{U}}{\partial{W}})^T \cdot V + ( \cfrac{\partial{V}}{\partial{W}})^T \cdot U Wf=W(u0v0+u1v1+u2v2)=Wu0v0+Wv0u0+Wu1v1+Wv1u1+Wu2v2+Wv2u2=(Wu0v0+Wu1v1+Wu2v2)+(Wv0u0+Wv1u1+Wv2u2)=(WU)TV+(WV)TU

    它可以推广到其它的维度。证明完毕。

    2)两个向量 U U U, V V V (列向量)叉积的结果对 W W W求导:
    ∂ ( U × V ) ∂ W = − S k e w ( V ) ( ∂ U ∂ W ) + S k e w ( U ) ( ∂ V ∂ W )   ( 5 ) \cfrac{\partial{(U \times V)}}{\partial{W}} = -Skew(V)( \cfrac{\partial{U}}{\partial{W}}) +Skew(U)( \cfrac{\partial{V}}{\partial{W}}) \space (5) W(U×V)=Skew(V)(WU)+Skew(U)(WV) (5)
    其中
    S k e w ( U ) = [ 0    − U 3    U 2 U 3    0    − U 1 − U 2    U 1    0 ] Skew(U) = \begin{bmatrix} 0 \space \space -U_3 \space \space U_2 \\ U_3 \space \space 0 \space \space -U_1 \\ -U_2 \space \space U_1 \space \space 0 \end{bmatrix} Skew(U)=0  U3  U2U3  0  U1U2  U1  0
    其中 S k e w ( V ) Skew(V) Skew(V)是将叉乘转化为点积的矩阵。它非常容易证明,因为它就是矩阵展开即可。
    对于多个向量叉乘的时候,需要对公式进行转化。叉乘满足分配率。
    ∂ ( U × V ) ∂ W = ( ∂ U ∂ W ) × V + U × ( ∂ V ∂ W )   ( 6 ) \cfrac{\partial{(U \times V)}}{\partial{W}} = ( \cfrac{\partial{U}}{\partial{W}}) \times V + U \times ( \cfrac{\partial{V}}{\partial{W}}) \space (6) W(U×V)=(WU)×V+U×(WV) (6)
    证明后续再补上。(5)和(6)两者的公式是想通的。只是表达形式不同。它们的转化后面再补上。

    证明:假设 U = [ u 0 u 1 u 3 ] U=\begin{bmatrix} u_0 \\ u_1 \\ u_3 \end{bmatrix} U=u0u1u3 V = [ v 0 v 1 v 3 ] V=\begin{bmatrix} v_0 \\ v_1 \\ v_3 \end{bmatrix} V=v0v1v3 ,它们为三维向量。

    U × V = [ i    j    k u 0    u 1    u 2 v 0    v 1    v 2 ] = ( u 1 v 2 − u 1 v 2 ) i + ( u 2 v 0 − u 0 v 2 ) j + ( u 0 v 1 − u 1 v 0 ) k U \times V = \begin{bmatrix} i \space \space j \space \space k \\ u_0 \space \space u_1 \space \space u_2 \\ v_0 \space \space v_1 \space \space v_2 \end{bmatrix} \\ = (u_1v_2 - u_1v_2)i+ (u_2v_0 - u_0v_2)j+ (u_0v_1 - u_1v_0)k U×V=i  j  ku0  u1  u2v0  v1  v2=(u1v2u1v2)i+(u2v0u0v2)j+(u0v1u1v0)k

    它是一个向量,因此展开后,它的表达为如下:

    U × V = [ ( u 1 v 2 − u 2 v 1 ) ( u 2 v 0 − u 0 v 2 ) ( u 0 v 1 − u 1 v 0 ) ] U \times V = \begin{bmatrix} (u_1v_2 - u_2v_1) \\ (u_2v_0 - u_0v_2) \\ (u_0v_1 - u_1v_0) \end{bmatrix} U×V=(u1v2u2v1)(u2v0u0v2)(u0v1u1v0)

    展开后得到如下:

    ∂ ( U × V ) ∂ W = [ ∂ ( u 1 v 2 − u 2 v 1 ) ∂ W ∂ ( u 2 v 0 − u 0 v 2 ) ∂ W ∂ ( u 0 v 1 − u 1 v 0 ) ∂ W ] = ∂ ( u 1 v 2 − u 2 v 1 ) ∂ W I + ∂ ( u 2 v 0 − u 0 v 2 ) ∂ W J + ∂ ( u 0 v 1 − u 1 v 0 ) ∂ W K = ( ∂ u 1 ∂ W ∗ v 2 + ∂ v 2 ∂ W ∗ u 1 − ∂ u 2 ∂ W ∗ v 1 − ∂ v 1 ∂ W ∗ u 2 ) I + ( ∂ u 2 ∂ W ∗ v 0 + ∂ v 0 ∂ W ∗ u 2 − ∂ u 0 ∂ W ∗ v 2 − ∂ v 2 ∂ W ∗ u 0 ) J + ( ∂ u 0 ∂ W ∗ v 1 + ∂ v 1 ∂ W ∗ u 0 − ∂ u 1 ∂ W ∗ v 0 − ∂ v 0 ∂ W ∗ u 1 ) K = [ ( ∂ u 1 ∂ W ∗ v 2 − ∂ u 2 ∂ W ∗ v 1 ) I + ( ∂ u 2 ∂ W ∗ v 0 − ∂ u 0 ∂ W ∗ v 2 ) J + ( ∂ u 0 ∂ W ∗ v 1 − ∂ u 1 ∂ W ∗ v 0 ) K ] + [ ( ∂ v 2 ∂ W ∗ u 1 − ∂ v 1 ∂ W ∗ u 2 ) I + ( ∂ v 0 ∂ W ∗ u 2 − ∂ v 2 ∂ W ∗ u 0 ) J + ( ∂ v 1 ∂ W ∗ u 0 − ∂ v 0 ∂ W ∗ u 1 ) K ] = ( ∂ U ∂ W ) × V − ( ∂ V ∂ W ) × U = − V × ( ∂ U ∂ W ) + U × ( ∂ V ∂ W ) = − S k e w ( V ) ( ∂ U ∂ W ) + S k e w ( U ) ( ∂ V ∂ W ) \cfrac{\partial{(U \times V)}}{\partial{W}} = \begin{bmatrix} \cfrac{\partial{(u_1v_2 - u_2v_1) }}{\partial{W}} \\ \cfrac{\partial{ (u_2v_0 - u_0v_2)}}{\partial{W}}\\ \cfrac{\partial{ (u_0v_1 - u_1v_0)}}{\partial{W}}\\ \end{bmatrix} = \cfrac{\partial{(u_1v_2 - u_2v_1) }}{\partial{W}} I + \cfrac{\partial{ (u_2v_0 - u_0v_2)}}{\partial{W}}J+ \cfrac{\partial{ (u_0v_1 - u_1v_0)}}{\partial{W}}K \\ = (\cfrac{\partial{u_1}}{\partial{W}}*v_2+\cfrac{\partial{v_2}}{\partial{W}}*u_1-\cfrac{\partial{u_2}}{\partial{W}}*v_1-\cfrac{\partial{v_1}}{\partial{W}}*u_2)I+(\cfrac{\partial{u_2}}{\partial{W}}*v_0+\cfrac{\partial{v_0}}{\partial{W}}*u_2-\cfrac{\partial{u_0}}{\partial{W}}*v_2-\cfrac{\partial{v_2}}{\partial{W}}*u_0)J + (\cfrac{\partial{u_0}}{\partial{W}}*v_1+\cfrac{\partial{v_1}}{\partial{W}}*u_0-\cfrac{\partial{u_1}}{\partial{W}}*v_0-\cfrac{\partial{v_0}}{\partial{W}}*u_1)K \\ =[(\cfrac{\partial{u_1}}{\partial{W}}*v_2 -\cfrac{\partial{u_2}}{\partial{W}}*v_1)I + (\cfrac{\partial{u_2}}{\partial{W}}*v_0 - \cfrac{\partial{u_0}}{\partial{W}}*v_2)J + (\cfrac{\partial{u_0}}{\partial{W}}*v_1 - \cfrac{\partial{u_1}}{\partial{W}}*v_0)K] + [(\cfrac{\partial{v_2}}{\partial{W}}*u_1 -\cfrac{\partial{v_1}}{\partial{W}}*u_2)I + (\cfrac{\partial{v_0}}{\partial{W}}*u_2 - \cfrac{\partial{v_2}}{\partial{W}}*u_0)J + (\cfrac{\partial{v_1}}{\partial{W}}*u_0 - \cfrac{\partial{v_0}}{\partial{W}}*u_1)K] \\ =( \cfrac{\partial{U}}{\partial{W}}) \times V - ( \cfrac{\partial{V}}{\partial{W}}) \times U = -V \times (\cfrac{\partial{U}}{\partial{W}}) + U \times ( \cfrac{\partial{V}}{\partial{W}})= -Skew(V)( \cfrac{\partial{U}}{\partial{W}}) +Skew(U)( \cfrac{\partial{V}}{\partial{W}}) W(U×V)=W(u1v2u2v1)W(u2v0u0v2)W(u0v1u1v0)=W(u1v2u2v1)I+W(u2v0u0v2)J+W(u0v1u1v0)K=(Wu1v2+Wv2u1Wu2v1Wv1u2)I+(Wu2v0+Wv0u2Wu0v2Wv2u0)J+(Wu0v1+Wv1u0Wu1v0Wv0u1)K=[(Wu1v2Wu2v1)I+(Wu2v0Wu0v2)J+(Wu0v1Wu1v0)K]+[(Wv2u1Wv1u2)I+(Wv0u2Wv2u0)J+(Wv1u0Wv0u1)K]=(WU)×V(WV)×U=V×(WU)+U×(WV)=Skew(V)(WU)+Skew(U)(WV)

    其中的假设 a , b a,b a,b为向量,易得如下
    a × b = − b × a a \times b = -b \times a a×b=b×a

    从三维可以拓展到多维向量中。证明完毕

    更多相关内容
  • 向量叉乘: 两个向量的坐标量积又叫做向量积,用于计算法向量。 游戏内应用: 用于判断物体在自身的左右方位。 还有应用于图形学里,对环境光照于自身顶点或者片元的法向量的夹角来判断光的强弱。 用于相机视图是否...

    向量叉乘:

    两个向量的坐标量积又叫做向量积,用于计算法向量。

    游戏内应用:

    1. 用于判断物体在自身的左右方位。
    2. 还有应用于图形学里,对环境光照于自身顶点或者片元的法向量的夹角来判断光漫反射的强弱。
    3. 用于相机视图是否剔除该面的渲染。
    4. 等等。

    判断方式

    在这里插入图片描述
    顺时针方向从b旋转到a,使用左手定则,四指方向是旋转方向,大拇指方向即为法向量方向。
    逆时针方向从a到b,可使用右手定则,上同。

    法向量的模定义为:在这里插入图片描述
    也就是ab平行四边形面积。

    要计算向量积,我们需要引用几个公式
    代数规则
    1、反交换律:a×b=-b×a

    2、加法的分配律:a×(b+c)=a×b+a×c。

    3、与标量乘法兼容:(ra)×b=a×(rb)=r(a×b)。

    4、不满足结合律,但满足雅可比恒等式:a×(b×c)+b×(c×a)+c×(a×b)=0。

    5、分配律,线性性和雅可比恒等式别表明:具有向量加法和叉积的R3构成了一个李代数。

    6、两个非零向量a和b平行,当且仅当a×b=0

    且当我们设坐标系三个单位向量为i,j,k可得:在这里插入图片描述
    根据以上几个代数规则可得
    在这里插入图片描述
    则a×b=[a2b3-a3b2,a3b1-a1b3,a1b2-a2b1]

    向量的点积:

    两向量a和b的点积(或称为标积)为一个标量,记为 a·b ,它的大小为:
    a · b = |a| |b| cosθ
    其中,θ为两向量a 与 b 的夹角。如果已知两向量的点积,可以通过下公式计算出两向量夹角,

    θ = arccos(a · b) / (|a| |b|)
    特殊情况也有a = b ,此时的θ = 0 , 有a · a = |a|²,即向量自身的点积为其模的平方。
    a·a有时候也简写为 a²。

    若设向量P= (x1,y1) , Q = (x2,y2) 则
    P · Q = x1 × x2 + y1 × y2

    展开全文
  • 一、向量叉乘 向量p=(x1,y1), q=(x2,y2) 则 pxq=x1.y2-x2.y1 pxq= - qxp 叉乘的大小等于于2倍三角形面积. 右手法则:手掌表示p向量,手指表示q向量,方向均指向指尖 pxq > 0, 则p在q的顺时针方向(q,p...

     汇总篇:计算几何汇总


    一、向量的叉乘

    向量p=(x1,y1), q=(x2,y2)

    pxq=x1.y2-x2.y1

    叉乘

    pxq= - qxp

    叉乘的大小等于于2倍三角形面积.

    右手法则:手掌表示p向量,手指表示q向量,方向均指向指尖

    pxq > 0, pq的顺时针方向(q,p),即大拇指朝上,手指与手掌弯曲成九十度,手指弯向左边,p逆时针方向旋转到q

    pxq<0,  pq的逆时针方向   (p,q)   ,即大拇指朝下,手指与手掌弯曲成九十度,手指弯向右边,p顺时针方向旋转到q

    pxq=0.  pq 重合

    代码计算叉乘

    class point{
     	public:
    	double x;
    	double y;
    	point(double x_=0,double y_=0):x(x_),y(y_){} 
    	friend const point operator+(const point& p1,const point& p2){
    		return point(p1.x+p2.x,p1.y+p2.y);
    	};
    	friend const point operator-(const point& p1,const point& p2){
    		return point(p1.x-p2.x,p1.y-p2.y);
    	};
    	friend const point operator*(const point& p,const double& m){
    		return point(p.x*m,p.y*m);
    	};
    	friend const point operator*(const double& m,const point& p){
    		return point(p.x*m,p.y*m);
    	};
    	friend const point operator/(const point& p,const double& m){
    		return point(p.x/m,p.y/m);
    	};
    	friend ostream& operator <<(ostream& out,point& a){
    		printf("(%lf,%lf)",a.x,a.y);
    		return out;
    	};
    };
    typedef point vect2;//重命名,向量也是用坐标表示 
    
    class line{
    	public:
    	point start;
    	point end; 
    	line(point s=point(0,0),point e=point(0,0)):start(s),end(e){}
    };
    
    double cross(point O,point A,point B){//叉乘 
    	double oa_x=A.x-O.x;
    	double oa_y=A.y-O.y;
    	double ob_x=B.x-O.x;
    	double ob_y=B.y-O.y;
    	return oa_x*ob_y-oa_y*ob_x;
    }

    二、向量的点乘

    向量p=(x1,y1), q=(x2,y2)

    pq=x1*x2+y1*y2

    double dot(point O,point A,point B){//点乘 
    	double oa_x=A.x-O.x;
    	double oa_y=A.y-O.y;
    	double ob_x=B.x-O.x;
    	double ob_y=B.y-O.y;
    	return oa_x*ob_x+oa_y*ob_y;
    }

    三、向量的夹角

    cos(alpha)=(pq)/(|p|*|q|)

    #include<cmath>
    
    double dot(point O,point A,point B){//点乘 
    	double oa_x=A.x-O.x;
    	double oa_y=A.y-O.y;
    	double ob_x=B.x-O.x;
    	double ob_y=B.y-O.y;
    	return oa_x*ob_x+oa_y*ob_y;
    }
    double dis(const point &p1,const point &p2){//求两点之间距离
    	double ans=(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
    	return sqrt(ans);
    }
    double angle(point O,point A,point B){//两向量OA,OB的夹角
    	return acos(dot(O,A,B)/(dis(O,A)*dis(O,B)));
    }

     

    展开全文
  • 向量点乘:a*b公式:a*b= |a| * |b| * cosθ点乘又叫向量的内积、数量积,是一个向量和它在另一个向量上的投影的长度的乘积;是标量。点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大。向量的...

    向量的点乘:a * b

    公式:a * b = |a| * |b| * cosθ

    点乘又叫向量的内积、数量积,是一个向量和它在另一个向量上的投影的长度的乘积;是标量。

    点乘反映着两个向量的“相似度”,两个向量越“相似”,它们的点乘越大。

    向量的叉乘:a ∧ b

    a ∧ b = |a| * |b| * sinθ

    向量积被定义为:

    模长:(在这里θ表示两向量之间的夹角(共起点的前提下)(0° ≤ θ ≤ 180°),它位于这两个矢量所定义的平面上。)

    方向:a向量与b向量的向量积的方向与这两个向量所在平面垂直,且遵守右手定则。(一个简单的确定满足“右手定则”的结果向量的方向的方法是这样的:若坐标系是满足右手定则的,当右手的四指从a以不超过180度的转角转向b时,竖起的大拇指指向是c的方向。c = a ∧ b)8b7d318c87f8d13ab5068a6d4ce14878.png

    特别的,在二维中,两个向量的向量积的模的绝对值等于由这两天向量组成的平行四边形的面积。a7c16476b843a4ecc8e83afa0b866637.png

    向量的叉乘,即求同时垂直两个向量的向量,即c垂直于a,同时c垂直于b(a与c的夹角为90°,b与c的夹角为90°)

    c =  a×b = (a.y*b.z-b.y*a.z , b.x*a.z-a.x*b.z  , a.x*b.y-b.x*a.y)f325447650d64de3bf341d21ec0ec5b3.png

    以上图为例a(1,0,0),b(0,1,0),c=a×b = (0,0,1)

    叉乘的几何意义

    |c|=|a×b|=|a| |b|sinα(α为a,b向量之间的夹角)

    |c| = a,b向量构成的平行四边形的面积 (如下图所示的平行四边形)4974d554cd08caf6297f060395c67a9f.png

    叉乘的拓展

    1.在一般的常识或者教科书中规定叉乘只有3d才拥有,其实2d也可以拓展出来一个叉乘形式,而且非常有用。

    拓展方式:假设有两个2d向量a,b,我们直接把他们视为3d向量,z轴补0,那么这个时候的a,b向量的叉乘结果c,c.x=0,c.y=0,c.z=a.x*b.y-b.x*a.y,

    这个时候可以吧2d的叉乘值定义为得到一个值,而不是得到一个向量,那么这个值k, k = c.z=a.x*b.y-b.x*a.y,我们可以通过这个k值得到很多有用的性质

    1.a,b向量构成的平行四边形的面积。

    2.如果k>0时,那么a正旋转到b的角度为<180°,如果k<0,那么a正旋转到b的角度为>180°,如果k=0 那么a,b向量平行。

    展开全文
  • 叉乘(Cross)可求 两向量围成的四边形面积、法向量 点乘(Dot)可求 一条向量在另一条向量的投影(正同向,负反向),两向量夹角 永久速记法: “叉鸡法,点头叫”
  • 0.前言在游戏开发中,确定目标的方位,朝向,夹角等相关数据需要用到向量间的计算,其中最常用到的就是点乘和叉乘。说实话,因为向量的运算在平时开发中不是经常使用,我也总弄混这两种运算的含义,所以这次好好区分...
  • 向量叉乘 (a×b)×c=b(a⋅c)−a(b⋅c)(a×b)×c = b(a·c) - a(b·c)(a×b)×c=b(a⋅c)−a(b⋅c) a×(b×c)=b(a⋅c)−c(a⋅b)a×(b×c) = b(a·c) - c(a·b)a×(b×c)=b(a⋅c)−c(a⋅b) a×b=[0−a3a2a30−a1−a2a10...
  • 向量点乘和叉乘

    千次阅读 2021-03-07 10:36:29
    向量点乘和叉乘2019-12-09 15:46:24文/董月点乘,也叫数量积。结果是一个向量在另一个向量方向上投影的长度,是一个标量。叉乘,也叫向量积。结果是一个已有两个向量都垂直的向量点乘和叉乘的区别点乘向量的...
  • 叉乘点乘、矩阵变换

    千次阅读 2022-02-19 10:10:38
    目录前言基础向量向量的定义向量的点乘向量点乘的运用向量的叉乘向量叉乘的运用矩阵的乘积变换Transform缩放Scale翻转切变旋转平移 前言基础 向量 向量的定义 向量:指具有大小(magnitude)方向的量。它可以形象...
  • 向量点乘和叉乘

    千次阅读 2021-05-02 10:56:12
    点乘和叉乘在unity中有广泛的应用:结论点乘判断角度,叉乘判断朝向方位。点乘:结果为一个常数又称"点积","数量积”,“内积”(Dot Product, 用*)对于向量 A = (x1, y1, z1) ,向量 B = (x2, y2, z2),则向量A点乘...
  • 向量叉乘和点乘

    千次阅读 2019-01-05 10:49:18
    1、https://www.cnblogs.com/zzdyyy/p/7643267.html 2、https://blog.csdn.net/nobleman__/article/details/79618331
  • 在coocoscreator中,会已知一个向量和角度,求另一个向量,TODO待完成 (2)向量b在a上的投影,可以将力进行分解 结论:最后红线部分的长度 = (3) 判断两个向量是否接近或者方向相同 结论: ...
  • 向量点乘叉乘和混合积(三重积)
  • Unity向量点乘和叉乘的使用

    千次阅读 2021-04-20 16:50:43
    Unity中点乘和叉乘点乘(API: Vector3.Dot())点乘的计算公式点乘的几何意义用途之一:判断一个物体当前方位利用点乘求出角度叉乘(API: Vector3.Cross())叉乘计算公式叉乘的几何意义判断物体是在左侧还是右侧 ...
  • 向量点乘叉乘

    千次阅读 2021-03-18 18:53:48
    简要介绍了向量点乘和叉乘
  • 向量点乘和叉乘的区别

    万次阅读 2020-09-09 19:48:11
    首先明显的区别在于:两个向量点乘的结果是一个标量,而两个向量叉乘的结果则还是一个向量。如下面的例子: 点乘: 向量a = (a1, a2, a3), 是一个1行3列的向量。向量b=(b1, 是一个3行1列的向量。两者点乘的结果为 ...
  • Unity中的叉乘和点乘

    千次阅读 2019-03-06 20:40:54
    两个向量点乘,就是我们说的数量级 a·b=|a|·|b|cosθ 结果是一个标量,如果==0,则两个向量夹角等于90度,垂直关系 小于0,则两个向量夹角大于90度 大于0,则两个向量夹角小于90度 如果cosθ等于-1,则两个...
  • 因为向量是有向线段,所以从几何意义上说,两点之间的距离等于从一个点到另一个点的向量的长度。现在,让我们导出3D中的距离公式。先计算从a到b的向量d,在3D情况中:a到b的距离等于向量d的长度。之前学...
  • 点乘叉乘是线性代数的基本知识,在工作中也经常能够遇到,下面我们来温习一下它们的概念以及使用C++代码对它们进行实现。
  • 叉乘点乘混合运算公式

    千次阅读 2020-12-20 17:54:51
    叉乘点乘混合运算公式:混合积具有轮换对称性:(a,b,c)=(b,c,a)=(c,a,b)=-(a,c,b)=-(c,b,a)=-(b,a,c)。混合运算公式混合积具有轮换对称性:(a,b,c)=(b,c,a)=(c,a,b)=-(a,c,b)=-(c,b,a)=-(b,a,c)在数学中,向量(也...
  • 一 两个向量点乘结果是一个标量 可以得到 怪物在我前方还是后方。游戏中扇形,矩形 区域检测可以用点乘 代码如下 1. 扇形检测 Vector3 toDir = enemy.transform.position - this.transform.position; //得到 怪物...
  • 向量叉乘和点乘在Unity中的意义

    万次阅读 2017-05-25 20:57:47
    向量点乘 用来求向量之间的夹角或者用来判断向量是否在同一方向、以及在某一方向的投影。 判断如下: a·b>0 方向基本相同,夹角在0°到90°之间 a·b=0 正交 a·b 向量叉乘 在Unity中的作用是...
  • 转自原创出处:http://blog.csdn.net/dcrmg/article/details/52416832向量是由n个实数组成的一个n行1列(n*1)或一个1行n列(1*n)的有序数组;向量点乘,也叫向量的内积、数量积,对...点乘公式对于向量a和向量b: a...
  •   向量之间的叉乘和点乘,概念易混淆,分别不清楚,因此本文专门对这个概念进行了详细分析介绍。
  • C++-向量点乘叉乘等操作

    万次阅读 2019-07-09 18:48:25
    向量点乘叉乘等操作。 代码 double ThreeDot(Point p,Point a,Point b){ return(a[0]-p[0])*(b[0]-p[0])+(a[1]-p[1])*(b[1]-p[1])+(a[2]-p[2])*(b[2]-p[2]); }//pa与pb的点积 (3点) Point ThreeCross(Point...
  • https://blog.csdn.net/july_unity/article/details/79265912
  • 【转】向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读向量是由n个实数组成的一个n行1列(n*1)或一个1行n列(1*n)的有序数组;向量点乘,也叫向量的内积、数量积,对两个向量执行点乘运算,就是对这两个向量...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,032
精华内容 2,012
关键字:

向量的叉乘和点乘关系

友情链接: S3C44B0Xpwm.rar