Strassen矩阵相乘算法的c++代码实现

合集下载

strassen算法-现实2次幂,偶数奇数

strassen算法-现实2次幂,偶数奇数
按照分治的思想可以看出要想减少乘法运算次数关键在于计算2个2阶方阵的乘积时能否用少于8次的乘法运算
Strassen算法
姓名: 王军袖 学号: 31609059
1
目录
1
算法思想
2
3
算法代码
运行结果
2
算法思想
分治算法
其核心思想是将大的问题分解成若干小的子问题进行 处理,从而使复杂的问题变得简单。表现在算法中就 是递归算法。
m1 m2 m3 m4 m5 m6 m7 = = = = = = = (a11 + a22) * (b11 + b22); (a21 + a22) * b11; a11 * (b12 - b22); a22 * (b21 - b11); (a11 + a12) * b22; (a21 - a11) * (b11 + b12); (a12 - a22) * (b21 + b22); 再做若干次加、减法: c11 = m1 + m4 - m5 + m7 c12 = m3 + m5 c21 = m2 + m4 c22 = m1 +m3 -m2 + m6
16
Matrix **cr=new Matrix*[n];//初始化cr,储存ar*br结果 //阶为偶数矩阵想乘 for ( i=0;i<n;i++){ Matrix MutiEven(Matrix A,Matrix B){ cr[i]=new Matrix[n]; int n=A.n,m=1; for ( j=0;j<n;j++) int i,j; cr[i][j]=Matrix(m); //将矩阵阶拆分成m*n,n为奇数 } m为2的幂次 for( i=0;i<n;i++)//用传统方法将ar和br相乘,储存在cr中 while(!(n&1)){ for( j=0;j<n;j++) n>>=1; for(int k=0;k<n;k++) m<<=1; cr[i][j]=Plus(cr[i][j],Muti2n(ar[i][k],br[k][j])); Matrix C(m*n);//声明C } for( i=0;i<n;i++)//将cr合并成一个矩阵C //将A拆分为n^2个m阶矩阵,在ar中储存。 for( j=0;j<n;j++) Matrix **ar=new Matrix*[n]; for(int x=0;x<m;x++) for ( i=0;i<n;i++){ for(int y=0;y<m;y++) ar[i]=new Matrix[n]; for ( j=0;j<n;j++) C.m[i*m+x][j*m+y]=cr[i][j].m[x][y]; ar[i][j]=Split(A,i*m,j*m,m); return C;} } Matrix **br=new Matrix*[n];//同A for (i=0;i<n;i++){ br[i]=new Matrix[n]; for ( j=0;j<n;j++) 17 br[i][j]=Split(B,i*m,j*m,m);}

矩阵乘法用c语言

矩阵乘法用c语言

矩阵乘法用c语言
互联网时代,科技进步极大地改变了我们的生活,同时也在各个领域带来了巨
大的技术突破,其中也包括了计算机软件编程技术。

在编程技术中,矩阵乘法是一个重要的数学基础,它被广泛应用于一些数学计算和学习识别,也应用于计算机软件的各种开发和运维工作中。

由于其复杂的数学运算,使用C语言来实现矩阵乘法显得尤为重要,需要编程者具备一定的编程技术,以及有较好的解决问题的能力。

矩阵乘法用C语言实现的原理非常简单,首先,编程者要对需要进行计算的矩
阵进行声明,并且明确其行数和列数,接着通过循环将矩阵进行赋值,最后利用两层嵌套的For循环进行乘法计算,将计算结果存放在新定义的数组中,依次进行,实现矩阵的乘法运算。

矩阵乘法的运算模型和代码实现虽然看上去很简单,但是本质上并不是一件容
易的事情,它要求编程者具备一定的数学基础知识,以及解决问题的能力,只有这样才能够将复杂的矩阵数学运算简单而又脱离实际应用,从而有效地简化程序代码,最终实现矩阵乘法的编程。

总之,矩阵乘法用C语言实现涉及到多项数学和编程技能,其原理简单易懂,
只要学习者有扎实的基础知识,以及有良好的抽象思维能力,就可以得心应手地实现矩阵乘法用C语言操作,成就一把把手。

strassen算法的实现

strassen算法的实现
算法步骤: 1.输入矩阵A 2.输入矩阵B 3.矩阵A/B以n/2分块 4.分块strassen相乘 5.主函数调用 6.输出结果 7.用普通矩阵相乘方法计算结果并输 出做对比
Page 1
算法思想: 问题的最小规模是n=2,这时直接调用矩阵乘法函数。当n>=2时 一· 分——减小问题规模 分治算法,把矩阵A(B同样)按上下左右分为四块,小的2阶矩阵。 并创造暂时变量A11、A12、A21、A22储存他们
Page 3
时间复杂度分析 Strassen矩阵乘积分治算法中,用了7次对于 n/2阶矩阵乘积的递归调用和18次n/2阶矩阵的 加减运算。由此可知,该算法的所需的计算时 间T(n)满足如下的递归方程:
按照解递归方程的套用公式法,其解为 T(n)=O(nlog7)≈O(n2.81) 缺陷: 只能经行2^k的矩阵乘法的实现 如果修改N为非2^k的数字(如:6)。该算法 无法运行。
Page 5
Page 6
Page 2
2:治--处理问题 先计算下面7个量(1) m1 = (a11 + a22) * (b11 + b22); m2 = (a21 + a22) * b11; m3 = a11 * (b12 - b22); m4 = a22 * (b21 - b11); m5 = (a11 + a12) * b22; m6 = (a21 - a11) * (b11 + b12); m7 = (a12 - a22) * (b21 + b22); C = AB,根据矩阵相乘的规则,C的各元素为(2) c11 = a11 * b11 + a12 * b21 c12 = a11 * b12 + a12 * b22 c21 = a21 * b11 + a22 * b21 c22 = a21 * b12 + a22 * b22

C语言实现矩阵计算

C语言实现矩阵计算

C语言实现矩阵计算C语言是一种广泛使用的编程语言,也是实现矩阵计算的一种常用工具。

在C语言中,我们可以使用数组来表示矩阵,并通过循环结构和算术运算符来实现矩阵计算的各种功能。

首先,我们需要实现矩阵的输入和输出功能。

在C语言中,我们可以使用二维数组来表示矩阵。

下面是一个示例代码,用来输入和显示一个矩阵:```c#include <stdio.h>//定义最大矩阵的大小#define MAX_SIZE 100//函数用于输入一个矩阵void inputMatrix(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols)printf("请输入矩阵元素:\n");for (int i = 0; i < rows; i++)for (int j = 0; j < cols; j++)scanf("%d", &matrix[i][j]);}}//函数用于显示一个矩阵void displayMatrix(int matrix[MAX_SIZE][MAX_SIZE], int rows, int cols)printf("矩阵元素为:\n");for (int i = 0; i < rows; i++)for (int j = 0; j < cols; j++)printf("%d ", matrix[i][j]);}printf("\n");}```上述代码定义了两个函数:`inputMatrix`用于输入一个矩阵,`displayMatrix`用于显示一个矩阵。

我们可以通过调用这两个函数来输入和显示矩阵。

接下来,我们可以实现矩阵的加法、减法和乘法等功能。

以下是一个示例代码,用于实现矩阵的加法:```c//函数用于计算两个矩阵的加法void addMatrix(int matrix1[MAX_SIZE][MAX_SIZE], intmatrix2[MAX_SIZE][MAX_SIZE], int result[MAX_SIZE][MAX_SIZE], int rows, int cols)for (int i = 0; i < rows; i++)for (int j = 0; j < cols; j++)result[i][j] = matrix1[i][j] + matrix2[i][j];}}```上述代码中,我们定义了一个`addMatrix`函数,该函数接受两个输入矩阵和一个结果矩阵,将两个输入矩阵的对应元素相加,并将结果存储在结果矩阵中。

实验二Strassen矩阵乘法

实验二Strassen矩阵乘法

实验2 Strassen矩阵乘法一、 实验目的1.理解Strassen矩阵乘法的分治思想Strassen矩阵乘法的分治法设计模式是:半分+混合2.改进Strassen矩阵乘法对内存的需求若按Strassen矩阵乘法的直接表述实现,则空间复杂度将是O(3n2),本实验将试图改进这个方面。

3.Strassen矩阵乘法的性能问题改进Strassen矩阵乘法的内存需求,并不一定能改进Strassen矩阵乘法的效率,本实验将试图测试一些较大规模(n>=1024)的n阶方阵的Strassen矩阵乘,探讨其效率问题。

二、 实验环境C/C++编程环境或任何编程语言环境三、 实验内容1. Strassen矩阵乘法描述尽管Strassen矩阵乘法的实用价值在当今的多核计算环境下可能不是那么显著,但其理论价值仍值得我们研究。

Strassen矩阵乘法体现了一类重要的分治算法设计模式,即半分+混合,同样具有这种算法设计模式的是FFT(Fast Fourier Transform)-“由于FFT这个卓越算法在实践上的重要意义,有些人把它看作是有史以来人们发明的最重要的算法之一。

”[1]Strassen 矩阵乘法的基本思想,可由下述矩阵乘法概括:输入:两个n=2k 维方阵A 和B (若A 和B 的维度不是2k ,则通过增加元素为0的行和列,以使A 和B 均为2k 维的方阵)输出:n 维方阵C(1)1+41+443-11+24134.12-43+4113.123-11+224.3424.1314.11.2412.4-4344+=A B =A B =A B =A B =A B M =A B M =A M M B M M M(2)为方便表示,这里采用与书本不同的下标表示法,如对于1个n/2维矩阵14.14M ,下标14.14表示其由两个矩阵A 1+4和B 1+4乘积而成,A 1+4表示A1+A4,同理B 1+4表示B1+B4,同理12.4M 表示A1+2与B4的乘积。

矩阵乘法(分治法)

矩阵乘法(分治法)

算法设计与分析实验报告二、模型拟制、算法设计和正确性证明:设A和B是两个n*n阶矩阵,求他们两的成绩矩阵C。

这里假设n是2的幂次方;A和B是两个n*n的矩阵,他们的乘积C=AB也是一个n*n的矩阵,矩阵C中的元素C[i][j]定义为C[i][j]= ,则每计算一个C[i][j],需要做n次乘法和n-1次加法。

因此计算C的n2个元素需要n3次乘法和n3- n2次加法。

因此,所需的时间复杂度是O(n3)。

但是使用分治法可以改进算法的时间复杂度。

这里,假设n是2的幂。

将矩阵A,B,C中每一矩阵都分成4个大小相等的子矩阵,每个子矩阵是(n/2)*(n/2)的方阵。

由此,可将方阵C=AB重写为因此可得:C11=A11B11+A12B21C12=A11B12+A12B22C21=A21B11+A22B22C22=A21B12+A22B22这样就将2个n阶矩阵的乘积变成计算8个n/2阶矩阵的乘积和4个n/2阶矩阵的加法。

当n=1时,2个1阶方阵的乘积可直接算出,只需要做一次乘法。

当子矩阵阶n>1时,为求两个子矩阵的乘积,可继续对两个子矩阵分块,直到子矩阵的阶为1。

由此,便产生了分治降阶的递归算法。

但是这个算法并没有降低算法的时间复杂度。

由strassen矩阵乘法,M1=A11(B12-B22)M2=(A11+A12)B22M3=(A21+A22)B11M4=A22(B21-B11)M5=(A11+A22)(B11+B22)M6=(A12-A22)(B21+B22)M7=(A11-A21)(B11+B12)C11=M5+M4-M2+M6C12=M1+M2C21=M3+M4C22=M5+M1-M3-M7四、程序实现和测试过程:程序测试过程(1)测试过程(2)源程序:#include<iostream>#include<math.h>#include<fstream>using namespace std;ifstream infile("123.txt",ios::in);void Input(int n,int **A){//infile>>n;for(int i=0;i<n;i++)for(int j=0;j<n;j++)infile>>A[i][j];}void Output(int n,int **A){for(int i=0;i<n;i++){for(int j=0;j<n;j++)cout<<A[i][j]<<'\t';cout<<endl;}cout<<endl;}void Divide(int n,int **A,int **A11,int **A12,int **A21,int **A22) {int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++){A11[i][j]=A[i][j];A12[i][j]=A[i][j+n];A21[i][j]=A[i+n][j];A22[i][j]=A[i+n][j+n];}}void Unit(int n,int **A,int **A11,int **A12,int **A21,int **A22) {int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++){A[i][j]=A11[i][j];A[i][j+n]=A12[i][j];A[i+n][j]=A21[i][j];A[i+n][j+n]=A22[i][j];}}void Sub(int n,int **A,int **B,int **C){int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++)C[i][j]=A[i][j]-B[i][j];}void Add(int n,int **A,int **B,int **C){int i,j;for(i=0;i<n;i++)for(j=0;j<n;j++)C[i][j]=A[i][j]+B[i][j];}void Mul(int n,int **A,int **B,int **M){if(n==1)M[0][0]=A[0][0]*B[0][0];else{n=n/2;int **A11,**A12,**A21,**A22;int **B11,**B12,**B21,**B22;int **M11,**M12,**M21,**M22;int **M1,**M2,**M3,**M4,**M5,**M6,**M7;int **T1,**T2;A11=new int*[n];A12=new int*[n];A21=new int*[n];A22=new int*[n];B11=new int*[n];B12=new int*[n];B21=new int*[n];B22=new int*[n];M11=new int*[n];M12=new int*[n];M21=new int*[n];M22=new int*[n];M1=new int*[n];M2=new int*[n];M3=new int*[n];M4=new int*[n];M5=new int*[n];M6=new int*[n];M7=new int*[n];T1=new int*[n];T2=new int*[n];int i;for(i=0;i<n;i++){A11[i]=new int[n];A12[i]=new int[n];A21[i]=new int[n];A22[i]=new int[n];B11[i]=new int[n];B12[i]=new int[n];B21[i]=new int[n];B22[i]=new int[n];M11[i]=new int[n];M12[i]=new int[n];M21[i]=new int[n];M22[i]=new int[n];M1[i]=new int[n];M2[i]=new int[n];M3[i]=new int[n];M4[i]=new int[n];M5[i]=new int[n];M6[i]=new int[n];M7[i]=new int[n];T1[i]=new int[n];T2[i]=new int[n];}Divide(n,A,A11,A12,A21,A22);Divide(n,B,B11,B12,B21,B22);// cout<<"A11,A12,A21,A22"<<endl;// Output(n,A11);Output(n,A12);Output(n,A21);Output(n,A22); Sub(n,B12,B22,T1);// cout<<"B12-B22"<<endl;// Output(n,T1);Mul(n,A11,T1,M1);Add(n,A11,A12,T2);Mul(n,T2,B22,M2);Add(n,A21,A22,T1);Mul(n,T1,B11,M3);Sub(n,B21,B11,T1);Mul(n,A22,T1,M4);Add(n,A11,A22,T1);Add(n,B11,B22,T2);Mul(n,T1,T2,M5);Sub(n,A12,A22,T1);Add(n,B21,B22,T2);Mul(n,T1,T2,M6);Sub(n,A11,A21,T1);Add(n,B11,B12,T2);Mul(n,T1,T2,M7);Add(n,M5,M4,T1);Sub(n,T1,M2,T2);Add(n,T2,M6,M11);Add(n,M1,M2,M12);Add(n,M3,M4,M21);Add(n,M5,M1,T1);Sub(n,T1,M3,T2);Sub(n,T2,M7,M22);Unit(n,M,M11,M12,M21,M22);}}int main(){int n;cout<<"please input number n"<<endl;cin>>n;int **A,**B,**C;A=new int*[n];B=new int*[n];C=new int*[n];for(int i=0;i<n;i++){A[i]=new int[n];B[i]=new int[n];C[i]=new int[n];}Input(n,A);cout<<"A Matrix is"<<endl;Output(n,A);Input(n,B);cout<<"B Matrix is"<<endl;Output(n,B);Input(n,C);//Output(n,C);Mul(n,A,B,C);cout<<"The Product of A and B is"<<endl;Output(n,C);// cout<<n<<endl;in();return 0;}1 / 1。

同阶矩阵相乘算法

同阶矩阵相乘算法

同阶矩阵相乘算法矩阵的乘法是一个复杂的运算,需要仔细地进行计算。

在实际的运算中,有两种主要的算法可以用来进行同阶矩阵的相乘,分别是传统的算法和Strassen算法。

传统的算法是基于矩阵的定义,通过逐个元素的运算来得到最终的结果。

具体来说,假设矩阵A为m行n列的矩阵,矩阵B为n行p列的矩阵,那么矩阵C为m行p列的矩阵。

矩阵C中的第(i,j)个元素为矩阵A的第i行与矩阵B的第j列对应元素的乘积之和。

传统的算法可以用下面的伪代码表示:```for i = 1 to m dofor j = 1 to p doC[i][j]=0for k = 1 to n doC[i][j]=C[i][j]+A[i][k]*B[k][j]```这个算法的时间复杂度为O(mnp),其中m、n、p分别为矩阵A、B和C的行数和列数。

这个算法的优点是简单易懂,容易实现,但是在大矩阵的情况下,时间复杂度较高,运算速度较慢。

Strassen算法是一种基于分治思想的矩阵乘法算法,它通过将矩阵分割成较小的子矩阵,并使用一系列的运算来计算最终结果。

Strassen算法通过将矩阵分解为四个相等大小的子矩阵,然后通过一系列的矩阵和和差的组合来计算子矩阵的乘积。

最后,将计算得到的子矩阵组合成最终的结果。

Strassen算法可以用下面的伪代码表示:```function strassen(A, B)if A 或 B 是 1x1 矩阵 then返回A*Belse将A和B分解为四个相等大小的子矩阵P1 = strassen(A11, B12 - B22)P2 = strassen(A11 + A12, B22)P3 = strassen(A21 + A22, B11)P4 = strassen(A22, B21 - B11)P5 = strassen(A11 + A22, B11 + B22)P6 = strassen(A12 - A22, B21 + B22)P7 = strassen(A11 - A21, B11 + B12)C11=P5+P4-P2+P6C12=P1+P2C21=P3+P4C22=P5+P1-P3-P7将子矩阵C11,C12,C21,C22组合成矩阵C返回C```这个算法的时间复杂度为O(n^log2(7)) ≈ O(n^2.81),其中n为矩阵A、B和C的行数和列数。

c语言 矩阵乘法

c语言 矩阵乘法

c语言矩阵乘法(实用版)目录一、矩阵乘法的概念二、C 语言中矩阵的表示方法三、矩阵乘法的计算方法四、C 语言实现矩阵乘法的示例代码五、矩阵乘法的应用正文一、矩阵乘法的概念矩阵乘法是矩阵运算中的一种,它用于将两个矩阵相乘得到一个新的矩阵。

矩阵乘法的意义在于将一个矩阵的每一行与另一个矩阵的每一列对应元素相乘,然后将结果相加得到新矩阵的每一个元素。

矩阵乘法在数学、物理和工程领域中有着广泛的应用,例如在计算机图形学中,矩阵乘法被用于计算物体的变换和投影。

二、C 语言中矩阵的表示方法在 C 语言中,矩阵可以通过数组来表示。

一般地,一个 m 行 n 列的矩阵可以用一个 m 行 n 列的二维数组来表示。

例如,一个 3 行 3 列的矩阵可以表示为:```int matrix[3][3] = {1, 2, 3,4, 5, 6,7, 8, 9};```三、矩阵乘法的计算方法矩阵乘法的计算方法可以分为以下几个步骤:1.判断两个矩阵是否可乘,即判断矩阵 A 的列数是否等于矩阵 B 的行数。

2.初始化一个临时矩阵,用于存储矩阵乘法的结果。

3.遍历矩阵 A 的每一行和矩阵 B 的每一列,将矩阵 A 的每一行与矩阵 B 的每一列对应元素相乘,然后将结果相加得到临时矩阵的每一个元素。

4.将临时矩阵转换为所需的矩阵类型,并返回结果矩阵。

四、C 语言实现矩阵乘法的示例代码下面是一个 C 语言实现矩阵乘法的示例代码:```c#include <stdio.h>int matrix_multiply(int m, int n, int p[][], int q[][], int r[][]) {int i, j, k;for (i = 0; i < m; i++) {for (j = 0; j < n; j++) {r[i][j] = 0;for (k = 0; k < p[i][j]; k++) {r[i][j] += p[i][j] * q[k][j];}}}return r;}int main() {int matrixA[3][3] = {{1, 2, 3},{4, 5, 6},{7, 8, 9}};int matrixB[3][3] = {{9, 8, 7},{6, 5, 4},{3, 2, 1}};int matrixC[3][3];matrixC = matrix_multiply(3, 3, matrixA, matrixB, matrixC);printf("矩阵 A 和矩阵 B 的乘积为:");for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {printf("%d ", matrixC[i][j]);}printf("");}return 0;}```五、矩阵乘法的应用矩阵乘法在数学、物理和工程领域中有着广泛的应用,例如在计算机图形学中,矩阵乘法被用于计算物体的变换和投影。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档