strassen矩陣乘法 Strassen矩陣乘法

2021-10-11 23:19:36 字數 3874 閱讀 4607

求矩陣a,b相乘的結果c

直接根據矩陣乘法的定義來遍歷計算。

c++語言**:

void matrixmul(int** a,int** b,int** c,int m,int b,int n)}}

}void test3(),};

int b[3][2]=,,};

int c[2][2]={};

matrixmul((int**)a,(int**)b,(int**)c,2,3,2);

for(int i=0;i<2;i++)

printf("\n");}}

與整數乘法類似,可以將矩陣a,b和c中每一矩陣都分塊成4個大小相等的子矩陣

依次將矩陣的乘法按照上圖拆分為最小單元的矩陣計算,即只有乙個元素,然後再返回。

在計算的時候,如果直接分解然後計算,需要進行8次乘法運算。strassen演算法可以將8次乘法降為7次乘法,從而降低時間複雜度:

最終達到降低複雜度為具體見**

#include 

#include 

#include 

#define size 16

using namespace std;

/* for taking input from standard input(keyboard)*/

void readmatrix(double a[size],int n)}}

/*for printing the matrix in standard output(console)*/

void writematrix(double a[size], int n)

printf("\n");}}

/*this function will add two square matrix*/

void matrixadd(double a[size], double b[size], double result[size], int n)}}

/*this function will subtract one  square matrix from another*/

void matrixsubtrac(double a[size], double b[size], double result[size], int n)}}

/*this is the strassen algorithm. (divide and conqure)*/

void strassenalgorithm(double a[size], double b[size], double c[size], int n)

// other cases are treated here:

else

}// calculating p1 to p7:

/*for details -- introduction to algorithms 3rd edition by clrs*/

matrixadd(a11, a22, aresult, divide);   // a11 + a22

matrixadd(b11, b22, bresult, divide);   // b11 + b22

strassenalgorithm(aresult, bresult, p1, divide);  // p1 = (a11+a22) * (b11+b22)

matrixadd(a21, a22, aresult, divide);   // a21 + a22

strassenalgorithm(aresult, b11, p2, divide); // p2 = (a21+a22) * (b11)

matrixsubtrac(b12, b22, bresult, divide); // b12 - b22

strassenalgorithm(a11, bresult, p3, divide); // p3 = (a11) * (b12 - b22)

matrixsubtrac(b21, b11, bresult, divide); // b21 - b11

strassenalgorithm(a22, bresult, p4, divide); // p4 = (a22) * (b21 - b11)

matrixadd(a11, a12, aresult, divide); // a11 + a12

strassenalgorithm(aresult, b22, p5, divide); // p5 = (a11+a12) * (b22)

matrixsubtrac(a21, a11, aresult, divide); // a21 - a11

matrixadd(b11, b12, bresult, divide); // b11 + b12

strassenalgorithm(aresult, bresult, p6, divide); // p6 = (a21-a11) * (b11+b12)

matrixsubtrac(a12, a22, aresult, divide); // a12 - a22

matrixadd(b21, b22, bresult, divide); // b21 + b22

strassenalgorithm(aresult, bresult, p7, divide); // p7 = (a12-a22) * (b21+b22)

// calculating c21, c21, c11 e c22:

matrixadd(p3, p5, c12, divide); // c12 = p3 + p5

matrixadd(p2, p4, c21, divide); // c21 = p2 + p4

matrixadd(p1, p4, aresult, divide); // p1 + p4

matrixadd(aresult, p7, bresult, divide); // p1 + p4 + p7

matrixsubtrac(bresult, p5, c11, divide); // c11 = p1 + p4 - p5 + p7

matrixadd(p1, p3, aresult, divide); // p1 + p3

matrixadd(aresult, p6, bresult, divide); // p1 + p3 + p6

matrixsubtrac(bresult, p2, c22, divide); // c22 = p1 + p3 - p2 + p6

// grouping the results obtained in a single matrice:

for (i = 0; i         }}

}/*the main function*/

void test4()

m = n;

if(m != (pow(2.0,count)))}}

}}strassenalgorithm(a,b,c,n); // strassenalgorithm called here

printf("matrix a:\n\n");

writematrix(a,m);

printf("matrix b:\n\n");

writematrix(b,m);

printf("the product of these two matrix:\n\n");

writematrix(c,m);

}

這份**只能計算方陣,而且使用巨集定義來預定矩陣最大尺寸,很醜陋。只是用來揭示strassen的計算過程。

Strassen矩陣乘法

strassen矩陣乘法 strassen矩陣乘法是通過遞迴實現的,它將一般情況下二階矩陣乘法 可擴充套件到 階,但strassen矩陣乘法要求 是 的冪 所需的8次乘法降低為7次,將計算時間從o ne3 降低為o ne2.81 矩陣c ab,可寫為 c11 a11b11 a12b21 c12 a1...

Strassen矩陣乘法

矩陣乘法是線性代數中最常見的運算之一,它在數值計算中有廣泛的應用。若a和b是2個n n的矩陣,則它們的乘積c ab同樣是乙個n n的矩陣。a和b的乘積矩陣c中的元素c i,j 定義為 若依此定義來計算a和b的乘積矩陣c,則每計算c的乙個元素c i,j 需要做n個乘法和n 1次加法。因此,求出矩陣c的...

strassen矩陣乘法

出處 矩陣乘法是線性代數中最常見的運算之一,它在數值計算中有廣泛的應用。若a和b是2個n n的矩陣,則它們的乘積c ab同樣是乙個n n的矩陣。a和b的乘積矩陣c中的元素c i,j 定義為 若依此定義來計算a和b的乘積矩陣c,則每計算c的乙個元素c i,j 需要做n個乘法和n 1次加法。因此,求出矩...