数学基础-向量与矩阵

向量点乘

两个向量点乘(x1,y1,z1).(x2,y2,z2),结果是一个数值

//向量点乘
inline float vec3_dot(Vec3& v1,Vec3& v2){
    return v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;
}

点乘的几何意义

计算两个向量正交性

当结果为0,表示两个向量垂直

当结果>0,表示两个向量方向相同,夹角在0~90度

当结果<0,表示两个向量方向相反,夹角在90~180度

  • 两个向量夹角0~90度

(0.5,0.5,0),(0.5,0,0)计算这两个点的点乘结果

0.50.5+0.50+0*0 = 0.25

image.png
  • 两个向量垂直

(0,0.5,0),(0.5,0,0)

00.5+0.50+0*0 = 0

image.png
  • 两个向量夹角90~180度

(0.5,0.5,0),(-0.5,0,0)

0.5*-0.5+0.50+00 = -0.25

image.png

计算两个向量的夹角

cos(θ) = (A·B) / (||A|| * ||B||)

其中:||A|| = √(A₁² + A₂² + ... + Aₙ²),||B|| = √(B₁² + B₂² + ... + Bₙ²)

向量叉乘

公式

两个三维向量 𝐀 = [𝐀₁, 𝐀₂, 𝐀₃] 和 𝐁 = [𝐁₁, 𝐁₂, 𝐁₃]

AxB叉乘结果是一个向量,通俗的讲法就是法向量,该向量垂直于 A ,B 向量构成的平面。

两个向量的叉乘公式如下:

<aside>
💡 𝐀 × 𝐁 = [𝐴₂𝐁₃ - 𝐴₃𝐁₂, 𝐴₃𝐁₁ - 𝐴₁𝐁₃, 𝐴₁𝐁₂ - 𝐴₂𝐁₁]

</aside>

inline Vec3 vec3_cross(Vec3& v1,Vec3& v2){

    Vec3 v;

    v.x = v1.y * v2.z - v1.z * v2.y;
    v.y = v1.z * v2.x - v1.x * v2.z;
    v.z = v1.x * v2.y - v1.y * v2.x;

    return v;

}

叉乘的几何意义

计算法向量

向量C = AxB

方向的判断

根据右手法则,axb表示红色法向量,表示大拇指的方向,四指从a指向b。

bxa或者-axb表示黄色法向量,表示大拇指的方向,四指方向从b指向a

image.png

向量 A 和向量B 构成的平行四边形面积

根据向量叉乘的性质,两个向量的叉乘结果的模长等于这两个向量所在平行四边形的面积。|𝐀 × 𝐁| = |𝐀| × |𝐁| × sin(θ),|𝐀| 表示向量 𝐀 的模长,|𝐁| 表示向量 𝐁 的模长,θ 表示向量 𝐀 和 𝐁 之间的夹角

面积的计算方式:

面积 = || 𝐴 × 𝐵 ||表示向量 𝐴 叉乘向量 𝐵 的模,也就是叉积的大小。

image.png
image.png

平行四边形面积:s = a*h

|A| = |A| = √(a₁² + a₂² + ... + aₙ²)

计算两个向量 A B的所形成的平行四边形的面积

image.png

矩阵运算

矩阵加法/减法

前提:同型矩阵。也就是两个矩阵的行列都要一样,结果还是一个矩阵

矩阵数乘

一个数值与矩阵相乘就叫做矩阵的数乘,结果还是一个矩阵

image.png

矩阵转置

把矩阵 A 的行和列相互交互所产生的矩阵称为 A 的转置矩阵,结果还是一个矩阵

mxn → nxm

image.png
//交换两个数
inline void swapf(float &a,float &b){
    float tmp = a;
    a = b;
    b = tmp;
}
//矩阵转置
inline Mat3x3 mat3x3_transpose(Mat3x3 &matrix){

    Mat3x3 result = matrix;

    swapf(result.r0.y,result.r1.x);
    swapf(result.r0.z,result.r2.x);
    swapf(result.r1.z,result.r2.y);
    return result;
}

矩阵相乘

前提:矩阵 A 的列数等于矩阵 B 的行数,A 矩阵mxn B 矩阵 nxp,因此矩阵的乘法不满足交换律

矩阵 C = A x B = mxp

矩阵行列式

一个矩阵的行列式的结果是一个数,它的几何意义是矩阵的行列式结果不为 0,表示该矩阵是可逆的。


image.png
inline float mat3x3_determinant(Mat3x3& matrix){
    return matrix.r0.x * (matrix.r1.y * matrix.r2.z -matrix.r1.z * matrix.r2.y)
    -matrix.r0.y * (matrix.r1.x * matrix.r2.z -matrix.r1.z * matrix.r2.x)
    +matrix.r0.z * (matrix.r1.x * matrix.r2.y -matrix.r1.y * matrix.r2.x);
}

伴随矩阵

矩阵 A 的伴随矩阵使用 A* 表示

inline Mat3x3 companion_mat3x3(Mat3x3& matrix){
    Mat3x3 inv;  
    Vec3 v1 = matrix.r0;
    Vec3 v2 = matrix.r1;
    Vec3 v3 = matrix.r2;
    float a11 = 1 * (v2.y * v3.z - v2.z * v3.y);
    float a12 = -1 * (v2.x * v3.z - v3.x * v2.z);
    float a13 = 1 * (v2.x * v3.y - v2.y * v3.x);

    float a21 = -1 * (v1.y * v3.z - v1.z * v3.y);
    float a22 = 1 * (v1.x * v3.z - v1.z * v3.x);
    float a23 = -1* (v1.x * v3.y - v1.y * v3.x);

    float a31 = 1 * (v1.y * v2.z - v1.z * v2.y);
    float a32 = -1 * (v1.x * v2.z - v1.z * v2.x);
    float a33 = 1 * (v1.x * v2.y - v1.y * v2.x);

    inv.r0.x = a11;
    inv.r0.y = a12;
    inv.r0.z = a13;

    inv.r1.x = a21;
    inv.r1.y = a22;
    inv.r1.z = a23;

    inv.r2.x = a31;
    inv.r2.y = a32;
    inv.r2.z = a33;
        
        //转置矩阵
    mat3x3_transpose(inv);

    //   inv.r0.x = a11;
    // inv.r0.y = a21;
    // inv.r0.z = a31;
    // inv.r1.x = a12;
    // inv.r1.y = a22;
    // inv.r1.z = a32;
    // inv.r2.x = a13;
    // inv.r2.y = a23;
    // inv.r2.z = a33;
    return inv;
}

矩阵 A 的伴随矩阵的计算过程如下所示

image.png

逆矩阵

矩阵 A 的逆矩阵 = 矩阵A的伴随矩阵/矩阵A的行列式

image.png

|A| 矩阵A的行列式如果不为0,则表示该矩阵是可腻的。

inline void vec3_div(Vec3& vec3,float div){
    vec3.x = vec3.x/div;
    vec3.y = vec3.y /div;
    vec3.z = vec3.z/div;
}

inline void mat3x3_div(Mat3x3& m,float div){
    vec3_div(m.r0,div);
    vec3_div(m.r1,div);
    vec3_div(m.r2,div);
}

inline Mat3x3 mat3x3_reverse(Mat3x3& matrix){
    float determinant = mat3x3_determinant(matrix);

    Mat3x3 compain_matrix = companion_mat3x3(matrix);

    mat3x3_div(compain_matrix,determinant);

    return compain_matrix;
}

下面是通过这个公式来推导出矩阵 A 的逆矩阵


image.png

参考

线性代数课程

08高斯消元、初等矩阵1_哔哩哔哩_bilibili

本文是笔者学习之后的总结,方便日后查看学习,有任何不对的地方请指正。

记录于2023年11月21日

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容