Python 謹慎使用python進行矩陣計算

2021-10-05 08:38:30 字數 2097 閱讀 9956

矩陣乘法:

左乘:設a為m*p的矩陣,b為p*n的矩陣,那麼稱m*n的矩陣c為矩陣a與b的乘積,記作c=ab,稱為a左乘以b。

左乘是做行變換;

用對角陣左乘乙個矩陣,就是用對角陣的對角元分別乘這個矩陣的對應各行;

右乘:設a為m*p的矩陣,b為p*n的矩陣,那麼度稱m*n的矩陣c為矩陣a與b的乘積,記作版c=ab,稱為b右乘以a。

右乘是做列變換;

用對角陣右乘乙個矩陣,就是用對角陣的對角元分別乘這個矩陣的對應各列。

謹慎使用python的numpy進行矩陣計算,理由如下:

(1)如果通過numpy包進行矩陣計算,可能把陣列誤認為矩陣!

比如numpy.diag([1,2,3]),返回是對角矩陣的形式,你以為是矩陣,其實是陣列!

當你發現所有矩陣乘法都變成陣列乘法的時候,很恐怖的一件事!

(2)如果你一定要用numpy,慎用星號*表示乘法!

如果a和b都是陣列,a*b是陣列乘法(對應元素相乘),返回陣列;

如果a和b中有乙個是矩陣,a*b預設變成矩陣運算(行列式相乘),返回矩陣;

(3)如果你一定要用numpy,千萬不要用1表示單位矩陣;

1-a,如果a是陣列,這裡的1預設為全1陣列(非單位矩陣的形式);

1-a,如果a是矩陣,這裡的1預設為全1矩陣(非單位矩陣的形式);

真正的單位矩陣,只有對角線元素為1,其他元素為0,用np.identity(n)生成單位矩陣;

(4)np.dot(a, b) 是做矩陣運算,但是返回值卻是陣列!

舉個例子:在python中,矩陣與陣列採用np.dot()計算時,雖然是矩陣計算,但是所得結果均為乙個陣列;

陣列在前時,可按照將陣列看成1行n列的矩陣,與矩陣相乘,可得計算結果。但需注意計算結果依然只是陣列,及其shape為(k,)形式,而不是(1,k);

附上**供理解:

import numpy as np

a = np.diag([1,2,3])

b = np.diag([4,5,6])

c = np.array([[0.1,0.2,0.3],[0.4,0.5,0.6],[0.7,0.8,0.9]])

print("\n區分 h_stack 和 column_stack")

print(np.hstack((a, b)))

print(np.column_stack((a, b)))

print("\n區分 陣列乘法 和 矩陣乘法")

print(type(a*c))

print(a*c)

print(type(a.dot(c)))

print(a.dot(c)) # 雖然是矩陣乘法,但返回值為陣列

print("\n區分 全1陣列 和 單位矩陣")

print(type(1-a))

print(1-a)

print(type(np.identity(3)-a))

print(np.identity(3)-a)

print("\n陣列乘法:(全1陣列-a)*對角陣列 = (單位陣列-a)*對角陣列")

print((1-a)*b)

print((np.diag([1,1,1])-a)*b)

print("\n矩陣乘法:全1矩陣x對角陣列) != 單位陣列x對角陣列)")

print((1-a).dot(b))

print(b.dot(1-a))

print(np.dot(1-a, b))

print(np.dot(b, 1-a))

print("\n對角陣列 x 陣列 = 兩個陣列對角元素相乘")

print(type(a*c))

print(a*c)

print("\n對角陣列 x 矩陣 = 對角陣的對角元分別乘這個矩陣的對應各行")

d = np.mat(c)

print(type(a*d))

print(a*d)

謹慎使用viewWithTag

uilabel cl title self viewwithtag 101 cl title.text infos total time uilabel cl distance self viewwithtag 102 cl distance.text infos distance uilabel ...

對於drawRect使用,謹慎使用

1.drawrect簡介 drawrect方法在uiview的使用上起著十分關鍵的作用。不知道大家注意過沒有,每一次建立uiview子類檔案時候,會有自動帶有已注釋的drawrect方法,也許從這一點就能看出這個方法的重要性。該方法定義在uiview uiviewrendering 分類裡面,望文生...

union的謹慎使用

include using namespace std float float666 myfloat 666 myinteger myinteger 1 return myfloat int main float float666 float666 coutmyinteger也被賦值了,myinte...