演算法導論 矩陣乘法strassen演算法

2021-06-22 14:41:05 字數 2573 閱讀 1720

矩陣運算在做科**算時是必不可少的,如果採用matlab來計算,這倒也容易。但是如果是自己寫c或者c++**,一般而言,需要做三次迴圈,其時間複雜度就是o(n^3)。

上圖給出了我們一般會採用的方法,就是對應元素相乘和相加。如果把c=a*b進行分解,可以看出,這裡需要進行8次的乘法運算:

分別是:

r = a * e + b * g ;

s = a * f  + b * h ;

t = c * e + d  * g; 

u = c * f + d * h;

本文介紹的演算法就是strassen提出的,可以將8次乘法降為7次乘法,雖然只是一次乘法,但是其實一次演算法耗時要比加減法多很多。處理的方法是寫成:

p1 = a * ( f - h )

p2 = ( a + b ) *  h

p3 = ( c +d ) * e

p4 = d *  ( g - e )

p5 = ( a + d ) * ( e + h )

p6 =  ( b - d ) * ( g + h ) 

p7 = ( a - c ) * ( e + f )

那麼只需要計算p1,p2,p3,p4,p5,p6,p7,然後

r  = p5 + p4 + p6 - p2

s = p1 + p2

t = p3 + p4

u = p5 + p1 - p3 - p7

這樣,八次的乘法就變成了7次乘法和一次加減法,最終達到降低複雜度為o( n^lg7 ) ~= o( n^2.81 );

c++**如下:

/*

strassen algorithm implementation in c++

coded by: seyyed hossein hasan pour matikolaee in may 5 2010 .

mazandaran university of science and technology,babol,mazandaran,iran

--------------------------------------------

email : [email protected]

ym : [email protected]

updated may 09 2010.

*/#include #include #include #include #include using namespace std;

int strassen(int n, int** matrixa, int ** matrixb, int ** matrixc);//multiplies two matrices recrusively.

int add(int** matrixa, int** matrixb, int** matrixresult, int length );//adds two matrices, and places the result in another matrix

int sub(int** matrixa, int** matrixb, int** matrixresult, int length );//subtracts two matrices , and places the result in another matrix

int mul(int** matrixa, int** matrixb, int** matrixresult, int length );//multiplies two matrices in conventional way.

void fillmatrix( int** matrix1, int** matrix2, int length);//fills matrices with random numbers.

void printmatrix( int **matrixa, int matrixsize );//prints the matrix content.

int main()

fillmatrix(matrixa,matrixb,matrixsize);

//*******************conventional multiplication test

cout<

mul(matrixa,matrixb,matrixc,matrixsize);

cout<

cout<

printmatrix(matrixc,matrixsize);

//*******************strassen multiplication test

cout<

strassen( n, matrixa, matrixb, matrixc );

cout<

cout<

printmatrix(matrixc,matrixsize);

cout<

演算法導論 矩陣鏈乘法

問題描述 給定有n個連乘矩陣的維數,要求計算其採用最優計算次序時所用的乘法次數,即所要求計算的乘法次數最少。例如,給定三個連乘矩陣的維數分別是10 100,100 5和5 50,採用 a1a2 a3,乘法次數為10 100 5 10 5 50 7500次,而採用a1 a2a3 乘法次數為100 5 ...

演算法導論之矩陣鏈乘法詳解

內容都是是演算法導論上的,僅作為乙個閱讀筆記,記錄一下自己閱讀過程中碰到的一些問題。希望能對需要的同學有所幫助!矩陣鏈乘法是指給定乙個n個矩陣的序列 矩陣鏈 a1,a2,an 我們希望計算它們的乘積 a1a2a3 an 對於這個問題,我們可以先用括號明確計算的次序,然後利用標準的矩陣相乘演算法進行計...

演算法導論 動態規劃之矩陣鏈乘法

原題見pdf204頁 a0a1a2a3a4a5 定義 a i 的維數為p i p i 1 m i j 為重a i 乘到a j 標量乘法運算的最小次數。m i j 0,當i j時 加入要求解的是m 0 2 則m 0 2 為m 0 0 m 1 2 p 0 p 1 p 3 m 0 1 m 2 2 p 0 ...