矩陣運算在做科**算時是必不可少的,如果採用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 ...