日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python矩阵运算与线形代数_[译] 线性代数:矩阵基本运算

發布時間:2024/8/23 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python矩阵运算与线形代数_[译] 线性代数:矩阵基本运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

線性代數:矩陣基本運算

在本文中,我們將介紹矩陣的大部分基本運算,依次是矩陣的加減法、矩陣的標量乘法、矩陣與矩陣的乘法、求轉置矩陣,以及深入了解矩陣的行列式運算。本文將不會涉及逆矩陣、矩陣的秩等概念,將來再探討它們。

矩陣的加減法

矩陣的加法與減法運算將接收兩個矩陣作為輸入,并輸出一個新的矩陣。矩陣的加法和減法都是在分量級別上進行的,因此要進行加減的矩陣必須有著相同的維數。

為了避免重復編寫加減法的代碼,我們先創建一個可以接收運算函數的方法,這個方法將對兩個矩陣的分量分別執行傳入的某種運算。然后在加法、減法或者其它運算中直接調用它就行了:class Matrix{

// ...

componentWiseOperation(func, { rows }) {

const newRows = rows.map((row, i) =>

row.map((element, j) => func(this.rows[i][j], element))

)

return new Matrix(...newRows)

}

add(other) {

return this.componentWiseOperation((a, b) => a + b, other)

}

subtract(other) {

return this.componentWiseOperation((a, b) => a - b, other)

}

}

const one = new Matrix(

[1, 2],

[3, 4]

)

const other = new Matrix(

[5, 6],

[7, 8]

)

console.log(one.add(other))

// Matrix { rows: [ [ 6, 8 ], [ 10, 12 ] ] }

console.log(other.subtract(one))

// Matrix { rows: [ [ 4, 4 ], [ 4, 4 ] ] }

矩陣的標量乘法

矩陣的標量乘法與向量的縮放類似,就是將矩陣中的每個元素都乘上標量:class Matrix{

// ...

scaleBy(number) {

const newRows = this.rows.map(row =>

row.map(element => element * number)

)

return new Matrix(...newRows)

}

}

const matrix = new Matrix(

[2, 3],

[4, 5]

)

console.log(matrix.scaleBy(2))

// Matrix { rows: [ [ 4, 6 ], [ 8, 10 ] ] }

矩陣乘法

當 A、B 兩個矩陣的維數是兼容的時候,就能對這兩個矩陣進行矩陣乘法。所謂維數兼容,指的是 A 的列數與 B 的行數相同。矩陣的乘積 AB 是通過對 A 的每一行與矩陣 B 的每一列計算點積得到:

class Matrix{

// ...

multiply(other) {

if (this.rows[0].length !== other.rows.length) {

throw new Error('The number of columns of this matrix is not equal to the number of rows of the given matrix.')

}

const columns = other.columns()

const newRows = this.rows.map(row =>

columns.map(column => sum(row.map((element, i) => element * column[i])))

)

return new Matrix(...newRows)

}

}

const one = new Matrix(

[3, -4],

[0, -3],

[6, -2],

[-1, 1]

)

const other = new Matrix(

[3, 2, -4],

[4, -3, 5]

)

console.log(one.multiply(other))

// Matrix {

// rows:

// [ [ -7, 18, -32 ],

// [ -12, 9, -15 ],

// [ 10, 18, -34 ],

// [ 1, -5, 9 ] ]}

我們可以把矩陣乘法 AB 視為先后應用 A 和 B 兩個線性變換矩陣。為了更好地理解這種概念,可以看一看我們的 linear-algebra-demo。

下圖中黃色的部分就是對紅色方塊應用線性變換 C 的結果。而線性變換 C 就是矩陣乘法 AB 的結果,其中 A 是做相對于 y 軸進行反射的變換矩陣,B 是做剪切變換的矩陣。

如果在矩陣乘法中調換 A 和 B 的順序,我們會得到一個不同的結果,因為相當于先應用了 B 的剪切變換,再應用 A 的反射變換:

轉置

轉置矩陣

由公式

定義。換句話說,我們通過關于矩陣的對角線對其進行翻轉來得到轉置矩陣。需要注意的是,矩陣對角線上的元素不受轉置運算影響。class Matrix{

// ...

transpose() {

return new Matrix(...this.columns())

}

}

const matrix = new Matrix(

[0, 1, 2],

[3, 4, 5],

[6, 7, 8],

[9, 10, 11]

)

console.log(matrix.transpose())

// Matrix {

// rows: [

// [ 0, 3, 6, 9 ],

// [ 1, 4, 7, 10 ],

// [ 2, 5, 8, 11 ]

// ]

// }

行列式運算

矩陣的行列式運算將計算矩陣中的所有系數,最后輸出一個數字。準確地說,行列式可以描述一個由矩陣行構成的向量的相對幾何指標(比如在歐式空間中的有向面積、體積等空間概念)。更準確地說,矩陣 A 的行列式相當于告訴你由 A 的行定義的方塊的體積。

矩陣的行列式運算如下所示:

矩陣的行列式運算如下所示:

我們的方法可以計算任意大小矩陣(只要其行列的數量相同)的行列式:class Matrix{

// ...

determinant() {

if (this.rows.length !== this.rows[0].length) {

throw new Error('Only matrices with the same number of rows and columns are supported.')

}

if (this.rows.length === 2) {

return this.rows[0][0] * this.rows[1][1] - this.rows[0][1] * this.rows[1][0]

}

const parts = this.rows[0].map((coef, index) => {

const matrixRows = this.rows.slice(1).map(row => [ ...row.slice(0, index), ...row.slice(index + 1)])

const matrix = new Matrix(...matrixRows)

const result = coef * matrix.determinant()

return index % 2 === 0 ? result : -result

})

return sum(parts)

}

}

const matrix2 = new Matrix(

[ 0, 3],

[-2, 1]

)

console.log(matrix2.determinant())

// 6

const matrix3 = new Matrix(

[2, -3, 1],

[2, 0, -1],

[1, 4, 5]

)

console.log(matrix3.determinant())

// 49

const matrix4 = new Matrix(

[3, 0, 2, -1],

[1, 2, 0, -2],

[4, 0, 6, -3],

[5, 0, 2, 0]

)

console.log(matrix4.determinant())

// 20

行列式可以告訴我們變換時對象被拉伸的程度。因此我們可以將其視為線性變換改變面積的因子。為了更好地理解這個概念,請參考 linear-algebra-demo:

在下圖中,我們可以看到對紅色的 1×1 方形進行線性變換后得到了一個 3×2 的長方形,面積從 1 變為了 6,這個數字與線性變換矩陣的行列式值相同。

如果我們應用一個剪切變換,可以看到方形會變成一個面積不變的平行四邊形。因此,剪切變換矩陣的行列式值等于 1:

如果行列式的值是負數,則說明應用線性變換后,空間被反轉了。比如在下圖中,我們可以看到變換前

的左邊,而變換后

的右邊。

如果變換的行列式為 0,則表示它會將所有空間都壓縮到一條線或一個點上。也就是說,計算一個給定矩陣的行列式是否為 0,可以判斷這個矩陣對應的線性變換是否會將對象壓縮到更小的維度去。

在三維空間里,行列式可以告訴你體積縮放了多少:

變換行列式等于 0,意味著原來的空間會被完全壓縮成體積為 0 的空間。如前文所說,如果在 2 維空間中變換的行列式為 0,則意味著變換的結果將空間壓縮成了一條線或一個點;而在 3 維空間中變換的行列式為 0 意味著一個物體會被壓扁成一個平面,如下圖所示:

出處:https://juejin.im/post/5d107b00f265da1b67211a21

總結

以上是生活随笔為你收集整理的python矩阵运算与线形代数_[译] 线性代数:矩阵基本运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 探花视频在线观看 | 欧美成人精品一区二区免费看片 | 亚洲自拍偷拍av | 国产女教师bbwbbwbbw | 一区二区在线视频播放 | 琪琪女色窝窝777777 | 日日操视频| 黄色大片视频网站 | 国产乱码一区二区三区在线观看 | 综合狠狠 | 国产情侣一区 | 国产精品aⅴ | 亚洲一区精品视频在线观看 | 五月婷婷六月综合 | 狠狠av| 性色综合| 日本一区二区视频 | 欧美激情 一区 | 一级美女大片 | 成人快手免费看片 | 美女扒开内裤让男人捅 | 日韩av三级在线观看 | 成人精品免费在线观看 | 国产69精品一区二区 | 免费视频精品 | 亚洲色域网 | 亚洲影院一区 | 久草天堂 | 91叉叉叉| 亚洲成人黄色小说 | 91香蕉视频在线观看免费 | av成人免费观看 | 91视色 | 在线波多野结衣 | 日韩精品久久久久久久电影99爱 | 亚洲成在线 | 国产91丝袜| 伊人99re| 一区二区 中文字幕 | 吸咬奶头狂揉60分钟视频 | 欧美激情免费在线 | 99久久婷婷国产综合精品草原 | 精品国产乱码久久久久久婷婷 | 欧美一区二区三区免费 | 福利视频亚洲 | 日韩国产精品一区二区三区 | 超碰2022| 日本天堂在线 | 合欢视频在线观看 | 国产视频亚洲 | 天天做夜夜操 | 久久资源总站 | 青娱乐免费在线视频 | 日本国产视频 | 韩国伦理片在线播放 | 欧洲中文字幕日韩精品成人 | 国产福利免费视频 | 国产美女精品在线 | 草莓视频成人在线 | 免费看的黄色录像 | 国产综合在线播放 | 就要干就要操 | 成人看片免费 | 天天夜碰日日摸日日澡性色av | 欧美日韩国产片 | 日韩精品一| 二区中文字幕 | 日韩影视一区 | 四季av中文字幕 | 欧美中出 | 亚洲欧美强伦一区二区 | 国产福利免费观看 | 青青草五月天 | 国产精品一区二区麻豆 | 嫩草嫩草嫩草嫩草嫩草 | 人妻 校园 激情 另类 | 日本激情影院 | 黄色片特级 | 欧美亚洲一区二区在线观看 | 成人a毛片久久免费播放 | 神马久久香蕉 | 影音先锋久久久 | 国产一区二区三区在线看 | 久久成人综合 | 成人在线视频网 | 国产高清精品一区二区三区 | 日韩黄色免费看 | 国产亚洲成av人在线观看导航 | 亚洲片国产一区一级在线观看 | aaa国产| 朝桐光av在线 | 青草久久久久 | 亚洲第一页色 | 丰满人妻熟女aⅴ一区 | 欧美日韩成人一区二区在线观看 | 伊人影视久久 | 亚洲a人 | 97人妻一区二区精品视频 | 日韩无遮挡 |