矩陣相乘優化演算法實現講解

2021-07-10 23:50:20 字數 1536 閱讀 2321

什麼是矩陣?

在數學中,矩陣(matrix)是指縱橫排列的二維資料**,最早來自於方程組的係數及常數所構成的方陣。這一概念由19世紀英國數學家凱利首先提出。

矩陣是高等代數學中的常見工具,也常見於統計分析等應用數學學科中。並且在acm競賽,有很多涉及到矩陣知識的題。許多演算法都會結合矩陣來處理,而比較具有代表性的矩陣演算法有:矩陣快速冪、高斯消元等等。

上述矩陣是乙個 4 × 3 矩陣:

某矩陣 a 的第 i 行第 j 列,或 i , j位,通常記為 a[i,j] 或 aij。在上述例子中 a[3,3]=2。

此外 aij = (aij),意為 a[i,j] = aij。

矩陣相乘的規則:矩陣與矩陣相乘 第乙個矩陣的列數必須等於第二個矩陣的行數 假如第乙個是m*n的矩陣 第二個是n*p的矩陣 則結果就是m*p的矩陣 且得出來的矩陣中元素具有以下特點:

第一行第一列元素為第乙個矩陣的第一行的每個元素和第二個矩陣的第一列的每個元素乘積的和 以此類推 第i行第j列的元素就是第乙個矩陣的第i行的每個元素與第二個矩陣第j列的每個元素的乘積的和。

單位矩陣: n*n的矩陣 mat ( i , i )=1; 任何乙個矩陣乘以單位矩陣就是它本身 n*單位矩陣=n, 可以把單位矩陣等價為整數1。(單位矩陣用在矩陣快速冪中)

例如下圖就是乙個7*7的單位矩陣:

① 依據簡單的矩陣相乘規則我們很容易寫出**:

for(int i=0;i  

這個**就是簡單的計算,按照計算規則,依次算出結果矩陣的每一位元素,就是乙個乙個的計算出所有元素。這種思路比較簡單好想,但是這種演算法的複雜度是o(n3),而且不能進行優化,所以在平時在進行矩陣乘法時使用起來往往會超時。

② 我們再看一種操作方法:

一行一行的計算出所有元素:

for(int i=0;i

其實就是乙個數為0的時候,這時候即使相乘也不會改變原來位置上的值。

比如,如果此時x[i][k]的值為0,那你即使進行迴圈操作,t[i][j]值一樣不會改變。所以,當x[i][j]值為0時,我們就沒必要再進行相乘操作。這樣的話就會優化一定的時間。而且這種優化對於一般演算法要求的時間複雜度已經足夠了。

優化後**示例:

for(int i=0;i

③ 還有一種操作是一列一列的計算出所有元素:

這種情況下一樣可以進行優化。

for(int j=0;j

演算法模板:

void matmul(llx[maxn][maxn],ll y[maxn][maxn])

; for(int i=0;i

使用MapReduce實現矩陣相乘演算法

看到一篇文章,列出了幾個使用mapreduce完成的演算法 附有實現案例 但是還是想自己實現下,所以自己寫了乙個,後來看了下案例,不是太一樣,但是我實現了,不管效果如何,或者好不好看,總之我實現了。這裡就跟大家分享下,同時也希望能得到乙個建議。首先介紹下我的實現思想 1.兩個矩陣相乘,我們假設為a ...

Strassen矩陣相乘演算法

strassen的矩陣相乘方法是一種典型的分治演算法。目前為止,我們已經見過一些分治策略的演算法了,例如歸併排序和karatsuba大數快速乘法。現在,讓我再來看看分治策略的背後是什麼。同動態規劃不同,在動態規劃中,為了得到最終的解決方案,我們經常需要把乙個大的問題 展開 為幾個子問題,但是這裡,我...

演算法提高 矩陣相乘

問題描述 小明最近在為線性代數而頭疼,線性代數確實很抽象 也很無聊 可惜他的老師正在講這矩陣乘法這一段內容。當然,小明上課打瞌睡也沒問題,但線性代數的習題可是很可怕的。小明希望你來幫他完成這個任務。現在給你乙個 ai 行 aj 列的矩陣和乙個 bi 行 bj 列的矩陣,要你求出他們相乘的積 當然也是...