python左除 程式設計用矩陣運算解線性方程組

2021-10-18 15:21:13 字數 3406 閱讀 1930

矩陣的乘法:

ruby標準庫中有matrix,定義矩陣是matrix形式:

2.4.0 :001 > require 'matrix'

=> true

2.4.0 :002 > matrix[[2, 3], [3, 5]] * matrix[[3],[4]]

=> matrix[[18], [29]]

julia:可以直接以陣列形式來寫矩陣,多行用分號分隔,每列用空格分隔。

julia> [2 3; 3 5] * [3; 4]

2-element array:

現在:記2元線性方程組:

2x + 3y = 18

3x + 5y = 29

可以抽象成矩陣乘法為:

即 matrix[[2,3],[3,5]] × matrix[[x],[y]] = matrix[[18],[29]] ruby的標準庫中有直接求逆矩陣:a.inv。 定義 a × b = c,根據逆矩陣變換,可以推知:b = a.inv × c b為什麼是a的逆矩陣 × c呢?這裡可以簡單證明:

a × b = c

a逆 × a × b = a逆 × c

a逆 × a = i (單位矩陣)

i × b = a逆 × c

i可以直接消除(單位矩陣乘以任何矩陣都不影響矩陣)(i類似於數值運算中的1,即 1 × n = n 和 n × 1 = n)。 故:b = a逆 × c julia中有乙個大寫的字母i直接表示任何長度的單位矩陣(意味著他能和任意矩陣相乘) i定義:

an object of type uniformscaling, representing an identity matrix of any size.

julia> i

uniformscaling

1*ijulia> i * [1 2; 3 4]

2×2 array:

1 23 4

julia> [1 2; 3 4] * i

2×2 array:

1 23 4

通過julia的語言驗證,你應該可以確信,上面的i可以直接消除了吧。

現在求[x,y]的值:

2.4.0 :003 > matrix[[2,3],[3,5]].inv * matrix[[18],[29]]

=> matrix[[(3/1)], [(4/1)]]

結果為分數形式:3/1和4/1即 3,4。

julia: julia中,定義 a × b = c 則 a \ c = b ( \ 為矩陣左除運算子,a \ b = inv(a) * b)

julia> [2 3; 3 5] \ [18; 29]

2-element array:

3.04.0

當然了,也可以用逆矩陣來解:

julia> inv([2 3; 3 5]) * [18; 29]

2-element array:

3.04.0

相比較ruby,我更喜歡julia的矩陣除法操作,定義和運算都很簡潔。 julia還有乙個矩陣的右除運算子(/,就是標準的除法,a / b = a * inv(b) ),這個右除即等同於ruby的矩陣 / 方法。

由上面可知道,如果乙個語言內部庫實現了逆矩陣以及矩陣乘法,就可以用來解線性方程組了。(當然有些逆矩陣是不存在,排除掉這種情況。)

ruby中雖然也定義了乙個矩陣的除法,不過其除法的定義是: a / b = a × b.inverse

而矩陣的乘法是不滿**換律的:即 a × b != b × a 所以,無法通過ruby的矩陣除法來求解上面格式的線性方程組,只能通過乘法來求: 即 a.inv × c = b

當然了,如果要用這個除法來解(ruby的矩陣除方法 / 和 julia的矩陣右除函式 / ) ,我們只能將線性方程做一次變換,即寫成:b x a = c,這樣 b = c / a 了:

進入ghci後,載入 matrix:位於data.matrix

prelude> :m data.matrix

prelude data.matrix> fromlists [[2,3],[3,5]] * fromlists [[3],[4]]

( 18 )

( 29 )

寫乙個函式來實現類似於julia的矩陣除法 (這裡用雙反斜槓來表示)

prelude data.matrix> a \\ b = (flip (*) b) (inverse a)

prelude data.matrix> fromlists [[2,3],[3,5]] \\ fromlists [[18],[29]]

right ( 3.0 )

( 4.0 )

可以看到,正常求出了x,y為3,4 定義的函式為matrix類:

prelude data.matrix> :t (\\)

:: (fractional a, eq a) =>

matrix a -> matrix a -> either string (matrix a)

也可以定義乙個list類上的運算:(這樣就更像julia的呼叫方式了)

prelude data.matrix> a \\\ b = (flip (*) $ fromlists b) (inverse $ fromlists a)

prelude data.matrix> [[2,3],[3,5]] \\\ [[18],[29]]

right ( 3.0 )

( 4.0 )

檢視型別:

:: (fractional a, eq a) =>

[[a]] -> [[a]] -> either string (matrix a)

實現haskell的矩陣右除法:b x a = c 得 b = c / a :

prelude data.matrix> let a / b = (a*) (inverse b)

prelude data.matrix> fromlists [[18,29]] / fromlists [[2,3],[3,5]]

right ( 3.0 4.0 )

python矩陣左除 Matlab運算子

運算子是乙個符號,它告訴編譯器執行特定的數學或邏輯操作。matlab主要用於整個矩陣和陣列的操作。因此,matlab中的運算子既可用於標量資料也可用於非標量資料。matlab允許以下型別的基本操作 算術運算子 關係運算子 邏輯運算子 按位運算子 集合運算子 下面我們來乙個乙個地學習。算術運算子 ma...

python矩陣左除 矩陣和陣列的區別

陣列中的元素可以是字元等 矩陣中的只能是數 這是二者最直觀的區別。因為矩陣是乙個數學概念 線性代數裡的 陣列是個計算機上的概念。你見過純粹數學中有陣列的概念嗎?沒有。因為計算機上 準確的說是資訊科學中 常用到線性代數的知識,就引用了矩陣的概念。精通matlab6.5版 張志湧編著,北京航空航天大學出...

python矩陣運算速度 用numpy矩陣加速計算

如果你的位元真的是每位元組8個 32個整型,您可以將smallmatrix縮小到20x16,然後嘗試以下方法,在這裡只做一行。newmatrix x,y 1當x周圍20x16的任何乙個位y是1?你到底在找什麼?在python m timeit s slide 16 bit mask across 3...