而 C 共有n2 个元素,因此总时间复杂度为 Θ(n3)。 这是一个很可怕的数字,当 n 较大时,连计算机都无法承受如此的计算时间。不过,凭着科学家们的智慧,人们逐渐发现存在一些低于 Θ(n3) 的矩阵乘法算法。Strassen是这方面的先驱,他率先把矩阵乘法的时间复杂度降到了 Θ(nlg7)≈Θ(n2.81) 。别小看这个细微...
Strassen 快速矩阵乘法,可以做到 \(\Theta(n^{\log_27})\) 考虑把一个矩阵化为 \(2^k\times2^k\) 的形式,然后分为四个角上大小均等的子矩阵 如果有 \(C=A*B\) 那么不妨记 \[ A=\left( \begin{array}{l} A_{1,1}
* return C inttype array * ***/ int** square_matrix_strassen_mutiply(int **A,int **B,int n){ int i,j; //only one element if (n == 1) { int** C = init_matrix(1); C[0][0] = A[0][0] * B[0][0]; return C; } else{ //...
} //调用Strassen方法实现C=A*B Strassen(N, A, B, C); //输出矩阵C中值 output(N, C); system("pause"); return0; } template<typename T> voidinput(intn, T p[][N]) { for(inti=0; i<n; i++) { cout<<"Please Input Line"<<i+1<<endl; ...
我们来数一数现在需要多少矩阵乘法和矩阵加法:S需要10次矩阵加法,P需要7次矩阵乘法,最后计算出C矩阵需要8次矩阵加法。因此计算C矩阵总共需要7次矩阵乘法和18次矩阵加法。相比于朴素算法,减少了一次矩阵乘法,增加了14次矩阵加法。而根据计算机原理,当达到一定量级,14个矩阵加法是要快于1一个矩阵乘法的。就这样实现了...
一般的矩阵乘法算法的时间复杂度为O(n^3)。然而,Volker Strassen在1969年提出了一种复杂度低于O(n^3)的矩阵乘法算法,证明了存在时间复杂度低于O(n^3)的算法。对于两个n * n的矩阵A和B,求C=AB,可通过以下公式求解:C[i][j]=Σ(A[i][k] * B[k][j])。通常,计算两个n * n矩阵...
Strassen算法的原理如下:假设矩阵A和矩阵B都是n*n矩阵,求矩阵C=A*B。首先,将矩阵A和矩阵B分为四个n/2*n/2的子矩阵。然后,计算7个矩阵乘积,每个矩阵都是n/2*n/2的,计算结果用于构建矩阵C。计算步骤如下:创建10个n*n的矩阵。递归计算7个矩阵乘积,每个乘积都是n/2*n/2的。通过特定...
输出格式 m行,每行n个空格隔开的整数,输出相乘後的矩阵C(i,j)的值。 样例输入 2...
} int multiply(int n,int A[64][64],int B[64][64],int C[64][64]) { if(n==2) //进行常规矩阵乘法运算 (也可将范围缩小到1) { C[0][0]=A[0][0]*B[0][0]+A[0][1]*B[1][0]; C[0][1]=A[0][0]*B[0][1]+A[0][1]*B[1][1]; ...
{ Strassen_classint stra;//定义Strassen_class类对象 int MatrixSize = 0; int** MatrixA; //存放矩阵A int** MatrixB; //存放矩阵B int** MatrixC; //存放结果矩阵 clock_t startTime_For_Normal_Multipilication; clock_t endTime_For_Normal_Multipilication; clock_t startTime_For_Strassen; ...