strassen矩阵相乘算法C++代码
- 格式:docx
- 大小:21.69 KB
- 文档页数:8
4-2.矩阵乘法的Strassen 算法详解题⽬描述请编程实现矩阵乘法,并考虑当矩阵规模较⼤时的优化⽅法。
思路分析根据wikipedia 上的介绍:两个矩阵的乘法仅当第⼀个矩阵B 的列数和另⼀个矩阵A 的⾏数相等时才能定义。
如A 是m×n 矩阵和B 是n×p 矩阵,它们的乘积AB 是⼀个m×p 矩阵,它的⼀个元素其中 1 ≤ i ≤ m,1 ≤ j ≤ p 。
值得⼀提的是,矩阵乘法满⾜结合律和分配率,但并不满⾜交换律,如下图所⽰的这个例⼦,两个矩阵交换相乘后,结果变了:下⾯咱们来具体解决这个矩阵相乘的问题。
解法⼀、暴⼒解法其实,通过前⾯的分析,我们已经很明显的看出,两个具有相同维数的矩阵相乘,其复杂度为O (n^3),参考代码如下:解法⼆、Strassen 算法在解法⼀中,我们⽤了3个for 循环搞定矩阵乘法,但当两个矩阵的维度变得很⼤时,O (n^3)的时间复杂度将会变得很⼤,于是,我们需要找到⼀种更优的解法。
⼀般说来,当数据量⼀⼤时,我们往往会把⼤的数据分割成⼩的数据,各个分别处理。
遵此思路,如果丢给我们⼀个很⼤的两个矩阵呢,是否可以考虑分治的⽅法循序渐进处理各个⼩矩阵的相乘,因为我们知道⼀个矩阵是可以分成更多⼩的矩阵的。
如下图,当给定⼀个两个⼆维矩阵A B 时:这两个矩阵A B 相乘时,我们发现在相乘的过程中,有8次乘法运算,4次加法运算:矩阵乘法的复杂度主要就是体现在相乘上,⽽多⼀两次的加法并不会让复杂度上升太多。
故此,我们思考,是否可以让矩阵乘法的运算过程中乘法的运算次数减少,从⽽达到降低矩阵乘法的复杂度呢?答案是肯定的。
1969年,德国的⼀位数学家Strassen 证明O (N^3)的解法并不是矩阵乘法的最优算法,他做了⼀系列⼯作使得最终的时间复杂度降低到了O(n^2.80)。
他是怎么做到的呢?还是⽤上⽂A B 两个矩阵相乘的例⼦,他定义了7个变量:如此,Strassen算法的流程如下:;表⾯上看,Strassen 算法仅仅⽐通⽤矩阵相乘算法好⼀点,因为通⽤矩阵相乘算法时间复杂度是,⽽Strassen 算法复杂度只是。
斯特拉森矩阵相乘算法(c语⾔实现)我们所要介绍的斯特拉森矩阵相乘算法是德国数学家沃尔克·施特拉森 (Volker Strassen) 于1969年提出的,该算法的主要思想是⼀种分治思想,即将⼀个2n的⽅阵分解成4个2n-1的⼩⽅阵。
借助这种办法,任何有穷⽅阵都可以简化为有限个2×2⽅阵,所以今天我们主要介绍斯特拉森算法在2×2⽅阵上的应⽤。
⾸先我们假设有两个2×2矩阵,A,B.A = a11 a12B = b11 b12a21 a22 b21 b22我们设矩阵相乘的结果矩阵为C。
则C = c11 c12c21 c22由斯特拉森算法可得7个⼩矩阵1. m1 = (a12 - a22)(b21 + b22)2. m2 = (a11 + a22)(b11 + b22)3. m3 = (a21-a11)(b11+b12)4. m4 = (a11+a12) * b225. m5 = a11 * (b12 - b22)6. m6 = a22 * (b21 - b11)7. m7 = (a21 + a22) * b11易得1. c11 = m6 + m1 + m2 - m42. c12 = m5 + m43. c21 = m6 + m74. c22 = m5 + m3 + m2 - m7应⽤该种⽅法可将花费的时间由最开始的Ω(n3 )变成了O(n lg7)⼜因为lg7在2.80和2.81之间,所以其运⾏时间为O(n2.81),相⽐⼀开始有较为明显的优化(尤其是在处理较⼤的矩阵时)。
⽰例代码如下:1int a[2][2] = { 2,3,4,5 },2 b[2][2] = { 1,7,2,6 };//输⼊矩阵3int c[2][2];//建⽴结果矩阵4int m1 = (a[0][1] - a[1][1]) * (b[1][0] + b[1][1]),5 m2 = (a[0][0] + a[1][1]) * (b[0][0] + b[1][1]),6 m3 = (a[1][0] - a[0][0]) * (b[0][0] + b[0][1]),7 m4 = (a[0][0] + a[0][1]) * b[1][1],8 m5 = a[0][0] * (b[0][1] - b[1][1]),9 m6 = a[1][1] * (b[1][0] - b[0][0]),10 m7 = (a[1][0] + a[1][1]) * b[0][0];11 c[0][0] = m6 + m2 + m1 - m4;12 c[0][1] = m5 + m4;13 c[1][0] = m6 + m7;14 c[1][1] = m5 + m3 + m2 - m7;。
矩阵乘法的一个新快速算法矩阵乘法对于两个矩阵的相乘,只有在第一个矩阵的列数和第二个矩阵的行数相同的时候,其乘积才有意义。
最早出现的就是一般的矩阵乘法,并且在很长的一段时间内人们都认为该算法无法继续改进,直到1969年,Strassen发明了一个算法,首次降低了矩阵乘法的时间复杂度,并且该算法也以他的名字命名——Strassen算法。
在后续的几十年里,人们在Strassen算法的基础上不断改进算法,并且在逐步降低矩阵乘法的时间复杂度。
比较有里程碑意义的是在1990年,Coppersmith和Winograd两个人对算法进行的改进,其算法也被称为算法。
一般矩阵乘法一般矩阵乘法,将第一个矩阵一行中的元素与第二个矩阵中一列对应位置上元素的乘积之和,作为第三个矩阵这一行一列对应位置的结果。
在这里插入图片描述在这里插入图片描述对于n*n的矩阵乘法其时间复杂度为O(n3)/** Generate Algorithm* matA a M*K matrix* matB a K*N matrix* matC a M*N matrix* matC = matA * matBstatic void mm_generate(float* matA, float* matB, float* matC, const int M, const int N, const int K){for (int i = 0; i < M;i++){for (int j = 0; j < N;j++){float sum = 0.0f;for (int k = 0; k < K;k++){sum += matA[i*K + k] * matB[k*N + j];}matC[i*N + j] = sum;}}}123456789101112131416171819202122分块算法将矩阵分割成四块来计算在这里插入图片描述在这里插入图片描述这里需要8个乘法和4个加法其时间复杂度依然是O(n3)Strassen 算法Strassen在分块的基础上进行改进在这里插入图片描述在这里插入图片描述这里用了7个乘法和18个加/减法对于每一个n * n 矩阵,可以看成有 2 * 2 的小矩阵拼接而来,因此会有n/2 * n/2 个小矩阵T(n) = 7 * T(n/2) + O(n2)T(n) = O(nlg7) + O(n2.81)其算法的时间复杂度为O(n2.81)Github:Straseen算法的代码实现相较与一般算法来说,只有在n很大的时候才会体现出性能上的优势,并且在实现是采用递归调用,每次调用会产生中间7个矩阵,所占用的空间要比一般的算法多。
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`函数,该函数接受两个输入矩阵和一个结果矩阵,将两个输入矩阵的对应元素相加,并将结果存储在结果矩阵中。
c语言strassen矩阵乘法代码Strassen矩阵乘法是一种高效的矩阵乘法算法,它通过将原始矩阵分解为较小的子矩阵,并使用递归的方法进行计算,从而减少了乘法运算的次数,提高了算法的效率。
在传统的矩阵乘法算法中,对于一个n×n的矩阵,需要进行n^3次乘法和n^2次加法运算。
而Strassen算法通过将矩阵分解为4个n/2×n/2的子矩阵,并使用一系列的加法和减法来计算乘积,从而减少了乘法运算的次数。
具体而言,Strassen算法的实现过程如下:1. 将输入矩阵A和B分别分解为4个n/2×n/2的子矩阵:A = | A11 A12 |B = | B11 B12 || | | || A21 A22 | | B21 B22 |2. 计算7个子矩阵的乘积:P1 = A11 * (B12 - B22)P2 = (A11 + A12) * B22P3 = (A21 + A22) * B11P4 = A22 * (B21 - B11)P5 = (A11 + A22) * (B11 + B22)P6 = (A12 - A22) * (B21 + B22)P7 = (A11 - A21) * (B11 + B12)3. 计算结果矩阵C的四个子矩阵:C11 = P5 + P4 - P2 + P6C12 = P1 + P2C21 = P3 + P4C22 = P5 + P1 - P3 - P74. 将四个子矩阵合并为结果矩阵C:C = | C11 C12 || || C21 C22 |通过上述步骤,可以得到矩阵乘法的结果。
需要注意的是,为了使Strassen算法能够适用于任意大小的矩阵,需要对矩阵的维度进行调整,使其为2的幂次方。
Strassen算法的时间复杂度为O(n^log2(7)),相比传统的矩阵乘法算法O(n^3)要小。
然而,由于Strassen算法中涉及到递归调用和大量的矩阵拆分和合并操作,其常数系数较大,因此在实际应用中,并不一定比传统的矩阵乘法算法更快。
矩阵连乘和strassen矩阵乘法矩阵连乘问题和 Strassen 矩阵乘法是计算机科学中的两个重要问题。
矩阵常常被用来表示线性算法问题,而矩阵的乘法则是表示两个矩阵之间运算的一种方法。
本文将对这两个问题分别进行介绍,以便更深入地了解矩阵的应用和计算方法。
矩阵连乘问题矩阵连乘问题是指给定一组矩阵,求其乘积的最小计算次数,并构造出相应的计算方法。
在算法中,我们通常采用递归的思想来解决这个问题。
递归过程中,我们根据矩阵的大小将矩阵划分成更小的子矩阵,然后再对这些子矩阵进行计算。
设矩阵连乘的矩阵序列为 A1, A2, A3, ..., An,其中矩阵 Ai 的行数和列数分别为 pi - 1 和 pi。
那么,计算这个矩阵序列的最小计算次数可以表示为递推式:m[i,j] = min{m[i,k] + m[k+1,j] + pi-1 * pk * pj} (i <= k < j)这个式子的意思是将矩阵序列Ai, Ai+1,...,Aj-1, Aj划分为两个子序列Ai, Ai+1,...,Ak和Ak+1,...,Aj,然后在这两个子序列中分别计算矩阵乘积所需的最小计算次数,其中pi-1 * pk * pj表示计算Ai到Aj乘积时需要的乘法次数。
由此,我们可以得出矩阵连乘的递归算法:Matrix Chain Multiply(A, p, i, j)if i == jreturn A[i]elsek = iM = Matrix Chain Multiply(A, p, i, k)N = Matrix Chain Multiply(A, p, k+1, j)return M * N其中,A是矩阵序列,p是矩阵的行列数,i和j表示矩阵序列的起止下标。
在递归过程中,我们用k将矩阵序列划分为两个部分,并分别计算左边和右边的矩阵乘积。
最后将两个部分的计算结果相乘即可。
这种算法的时间复杂度为O(n^3),在处理大规模的矩阵乘积时效率较低。
实验报告课程名称:算法设计与分析班级:12软工一班实验成绩:实验名称:Strassen矩阵乘法学号:1242159101 批阅教师签字:实验编号:实验一姓名:陈双飞实验日期:2014年12月14日指导教师:陈平组号:实验时间:时分-时分一、实验目的通过算法的程序实现和执行时间测试、并与理论上的结论进行对比分析,深入理解算法时间复杂度分析中对于输入数据考虑其等价类的意义,理解算法时间复杂度渐进性态和和增长率的概念,为后续学习和实验奠定基础,同时也学习程序效率测试的基本思路。
二、实验内容与实验步骤(1)了解分治的基本思想并编写算法解决Strassen矩阵乘法问题。
(2)打开一台装有MyEclipse-10.7.1的PC。
(3)把已经写好的代码在Java环境下运行并调试。
(4)记录运行结果。
三、实验环境Windows 7家庭普通版,MyEclipse-10.7.1四、阐述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的n2个元素所需的计算时间为0(n3)。
60年代末,Strassen采用了类似于在大整数乘法中用过的分治技术,将计算2个n阶矩阵乘积所需的计算时间改进到O(nlog7)=O(n2.18)。
五、问题分析首先,我们还是需要假设n是2的幂。
将矩阵A,B和C中每一矩阵都分块成为4个大小相等的子矩阵,每个子矩阵都是n/2×n/2的方阵。
由此可将方程C=AB重写为:(1)由此可得:C11=A11B11+A12B21 (2)C12=A11B12+A12B22(3)C21=A21B11+A22B21(4)C22=A21B12+A22B22 (5)如果n=2,则2个2阶方阵的乘积可以直接用(2)-(3)式计算出来,共需8次乘法和4次加法。
矩阵运算——C语言实现矩阵运算是线性代数中非常重要的一部分,它涉及到矩阵的加法、减法、乘法、转置等操作。
在C语言中,我们可以使用二维数组来表示和操作矩阵。
首先,我们需要定义一个表示矩阵的结构体,可以包含矩阵的行数、列数以及矩阵的元素值。
代码如下:```ctypedef structint rows; // 行数int cols; // 列数double **data; // 矩阵元素} Matrix;```在此结构体中,我们使用一个二维指针来表示矩阵的元素,其中每个指针指向一个一维数组,表示矩阵的一行。
接下来,我们可以实现一些常用的矩阵运算函数,比如矩阵的创建、销毁、加法、减法、乘法等。
1.矩阵的创建和销毁函数如下所示:```cMatrix *createMatrix(int rows, int cols)Matrix *matrix = (Matrix *)malloc(sizeof(Matrix));matrix->rows = rows;matrix->cols = cols;matrix->data = (double **)malloc(rows * sizeof(double *));for (int i = 0; i < rows; ++i)matrix->data[i] = (double *)malloc(cols * sizeof(double));}return matrix;void destroyMatrix(Matrix *matrix)for (int i = 0; i < matrix->rows; ++i)free(matrix->data[i]);}free(matrix->data);free(matrix);```这里我们使用了动态内存分配,先分配一维数组的内存,再分配二维数组的内存。
2.矩阵的加法和减法函数如下所示:```cMatrix *addMatrix(Matrix *matrix1, Matrix *matrix2)if (matrix1->rows != matrix2->rows , matrix1->cols != matrix2->cols)return NULL;}Matrix *result = createMatrix(matrix1->rows, matrix1->cols);for (int i = 0; i < matrix1->rows; ++i)for (int j = 0; j < matrix1->cols; ++j)result->data[i][j] = matrix1->data[i][j] + matrix2->data[i][j];}}return result;Matrix *subtractMatrix(Matrix *matrix1, Matrix *matrix2)if (matrix1->rows != matrix2->rows , matrix1->cols != matrix2->cols)return NULL;}Matrix *result = createMatrix(matrix1->rows, matrix1->cols);for (int i = 0; i < matrix1->rows; ++i)result->data[i][j] = matrix1->data[i][j] - matrix2->data[i][j];}}return result;```这里我们首先判断两个矩阵是否具有相同的行数和列数,如果不相同则无法进行加法或减法运算。
#include〈stdio.h>#include〈stdlib。
h〉#define col 3#define row 3class matrix//类的定义{private:double m[col][row];//矩阵设置为私有的,public:matrix(){}//无参数的构造函数matrix(double a[col][row]);//有参数的构造函数matrix Add(matrix &b);//加法运算声明matrix Sub(matrix &b);//减法运算声明matrix Mul(matrix &b);//乘法运算声明matrix Div(matrix &b);//除法运算声明matrix Inverse();//求逆运算声明~matrix();//析构函数声明void display();//显示函数声明};matrix::matrix(double a[col][row])//构造函数的定义{int i,j;for(i=0;i<col;i++)for(j=0;j〈row;j++)m[i][j]=a[i][j];}matrix matrix::Add(matrix &b)//加法运算{int i,j;matrix*c=(matrix*)malloc(sizeof(matrix));for(i=0;i<col;i++)for(j=0;j<row;j++)c—〉m[i][j]=m[i][j]+b.m[i][j];return(*c);}matrix matrix::Sub(matrix &b)//减法运算{int i,j;matrix*c=(matrix*)malloc(sizeof(matrix));for(i=0;i〈col;i++)for(j=0;j<row;j++)c->m[i][j]=m[i][j]—b。
m[i][j];return *c;}matrix matrix::Mul(matrix &b)//乘法运算{int i,j,k;double sum=0;matrix*c=(matrix*)malloc(sizeof(matrix));for(i=0;i<col;i++){for(j=0;j〈row;j++){for(k=0;k〈row;k++)sum+=m[i][k]*(b.m[k][j]);c-〉m[i][j]=sum;sum=0;}}return(*c);}matrix matrix::Div(matrix &b)//除法运算{//除法直接求解,参见主函数matrix c;return(c);}matrix matrix::Inverse()//求逆运算{//参考博客:http:///rollenholt/articles/2050662。
矩阵计算C语言源代码下面是一个简单的矩阵计算的C语言源代码:```c#include <stdio.h>//函数声明void addMatrix(int rows, int columns, int matrixA[][columns], int matrixB[][columns], int result[][columns]);void multiplyMatrix(int rows, int columnsA, int columnsB,int matrixA[][columnsA], int matrixB[][columnsB], intresult[][columnsB]);void printMatrix(int rows, int columns, intmatrix[][columns]);int maiint rows, columns;//输入矩阵的行数和列数printf("Enter the number of rows in the matrices: ");scanf("%d", &rows);printf("Enter the number of columns in the matrices: ");scanf("%d", &columns);int matrixA[rows][columns], matrixB[rows][columns], sumMatrix[rows][columns], productMatrix[rows][columns];//输入矩阵A的元素printf("Enter the elements of matrix A:\n");for (int i = 0; i < rows; i++)for (int j = 0; j < columns; j++)scanf("%d", &matrixA[i][j]);}}//输入矩阵B的元素printf("Enter the elements of matrix B:\n");for (int i = 0; i < rows; i++)for (int j = 0; j < columns; j++)scanf("%d", &matrixB[i][j]);}}//计算两个矩阵的和addMatrix(rows, columns, matrixA, matrixB, sumMatrix);//计算两个矩阵的乘积multiplyMatrix(rows, columns, columns, matrixA, matrixB, productMatrix);printf("Sum of the matrices:\n");printMatrix(rows, columns, sumMatrix);printf("Product of the matrices:\n");printMatrix(rows, columns, productMatrix);return 0;//函数定义:将两个矩阵相加void addMatrix(int rows, int columns, int matrixA[][columns], int matrixB[][columns], int result[][columns])for (int i = 0; i < rows; i++)for (int j = 0; j < columns; j++)result[i][j] = matrixA[i][j] + matrixB[i][j];}}//函数定义:将两个矩阵相乘void multiplyMatrix(int rows, int columnsA, int columnsB,int matrixA[][columnsA], int matrixB[][columnsB], intresult[][columnsB])for (int i = 0; i < rows; i++)for (int j = 0; j < columnsB; j++)result[i][j] = 0;for (int k = 0; k < columnsA; k++)result[i][j] += matrixA[i][k] * matrixB[k][j];}}}//函数定义:打印矩阵void printMatrix(int rows, int columns, intmatrix[][columns])for (int i = 0; i < rows; i++)for (int j = 0; j < columns; j++)printf("%d ", matrix[i][j]);}printf("\n");}```该程序首先要求用户输入两个矩阵的行数和列数,然后用户根据提示分别输入两个矩阵的元素。
矩阵相乘代码矩阵相乘是计算机科学中非常重要的一个问题,涉及到很多领域,如图像处理、人工智能、机器学习等。
在本文中,我们将探讨矩阵相乘的基本原理和实现方法,并提供一些示例代码来帮助读者更好地理解。
一、矩阵相乘的基本原理矩阵相乘是指将两个矩阵进行运算,得到一个新的矩阵。
具体来说,设A为m行n列的矩阵,B为n行p列的矩阵,则它们的积C为一个m行p列的矩阵。
其中,Cij表示A的第i行与B的第j列对应元素相乘后求和得到的结果。
例如,假设有如下两个矩阵:A = [1 2 3]B = [4 5][4 5 6] [6 7][8 9]则它们的积C为:C = AB = [1*4+2*6+3*8 1*5+2*7+3*9][4*4+5*6+6*8 4*5+5*7+6*9]即:C = [32 38][77 92]二、矩阵相乘的实现方法1. 暴力法暴力法是矩阵相乘的最基本实现方法,其思路就是按照定义直接计算出每个元素的值。
具体来说,对于矩阵A和B,我们可以使用三重循环遍历它们的每个元素,并按照定义计算出C的每个元素。
代码如下:for i in range(m):for j in range(p):for k in range(n):C[i][j] += A[i][k] * B[k][j]其中,m、n、p分别为A、B、C的行数和列数。
由于暴力法需要进行三重循环遍历,因此时间复杂度为O(mnp)。
当矩阵较大时,该方法的效率会非常低。
2. 分治法分治法是一种将问题分解成若干子问题并分别求解的算法。
对于矩阵相乘问题,我们可以将A和B分别划分成四个子矩阵,并递归地求解它们的积。
最后再将这四个积组合起来得到C。
具体来说,假设A和B都是2^n行2^n列的方阵,则可以按如下方式进行划分:A = [A11 A12]B = [B11 B12][A21 A22] [B21 B22]其中,A11、A12、A21、A22、B11、B12、B21和B22都是2^(n-1)行2^(n-1)列的子矩阵。
C语言实现两个矩阵相乘矩阵相乘是线性代数中的一项基本运算,也是计算机科学中常见的操作。
在C语言中,我们可以使用嵌套循环来实现两个矩阵的相乘。
首先,让我们先了解一下矩阵相乘的规则。
两个矩阵相乘的结果矩阵的行数等于第一个矩阵的行数,列数等于第二个矩阵的列数。
具体来说,设A是一个mxn的矩阵,B是一个nxp的矩阵,那么它们的乘积C将是一个mxp的矩阵。
第i行第j列的元素c(i,j)可以通过如下方式计算:c(i,j)=a(i,1)*b(1,j)+a(i,2)*b(2,j)+...+a(i,n)*b(n,j)接下来,我们可以开始编写C语言代码来实现这个矩阵相乘的操作。
首先,我们需要定义三个矩阵A、B和C,并初始化它们的值。
假设A和B 的值都是从用户输入中得到的,而C的值将在计算过程中生成。
```c#include <stdio.h>#define MAX_ROWS 100#define MAX_COLS 100int maiint A[MAX_ROWS][MAX_COLS];int B[MAX_ROWS][MAX_COLS];int C[MAX_ROWS][MAX_COLS];int m, n, p; // 行数、列数和列数printf("请输入第一个矩阵的行数和列数(以空格分隔):"); scanf("%d %d", &m, &n);printf("请输入第一个矩阵的元素:\n");for (int i = 0; i < m; i++)for (int j = 0; j < n; j++)scanf("%d", &A[i][j]);}}printf("请输入第二个矩阵的列数:");scanf("%d", &p);printf("请输入第二个矩阵的元素:\n");for (int i = 0; i < n; i++)for (int j = 0; j < p; j++)scanf("%d", &B[i][j]);}}//进行矩阵相乘的计算for (int i = 0; i < m; i++)for (int j = 0; j < p; j++)int sum = 0;for (int k = 0; k < n; k++)sum += A[i][k] * B[k][j];}C[i][j] = sum;}}printf("两个矩阵相乘的结果为:\n");for (int i = 0; i < m; i++)for (int j = 0; j < p; j++)printf("%d ", C[i][j]);}printf("\n");}return 0;```以上代码实现了两个矩阵相乘的功能。
文章标题:迭代法求解矩阵链相乘问题c语言一、引言在计算机科学中,矩阵链相乘问题是一个经典的问题,也是动态规划的典型应用之一。
在实际应用中,我们经常会遇到需要对多个矩阵进行相乘的情况,例如在图形处理、人工智能等领域,矩阵相乘是一种常见的操作。
而利用迭代法求解矩阵链相乘问题,可以有效地提高计算效率,本文将对此进行深入探讨。
二、迭代法求解矩阵链相乘问题1. 问题描述矩阵链相乘问题是指给定n个矩阵{A1, A2, ..., An},其中矩阵Ai的维度为pi-1 * pi,求解它们相乘的最小次数和计算次数最小的次序。
2. 算法思路迭代法求解矩阵链相乘问题的基本思路是利用动态规划的思想,通过迭代的方式逐步求解子问题,最终得到整体的最优解。
具体而言,可以采用自底向上的方法,先求解较小规模的子问题,然后逐步扩大规模,直至求解整个问题。
3. 算法实现通过编写C语言程序,我们可以很好地实现迭代法求解矩阵链相乘问题。
我们需要定义一个二维数组来保存子问题的最优解,然后利用循环迭代的方式逐步填充数组,最终得到最优解。
在实际编写过程中,需要注意细节和边界条件的处理,以确保程序的正确性和高效性。
三、个人观点和理解迭代法求解矩阵链相乘问题在计算机科学中具有重要的意义,它不仅可以帮助我们更好地理解动态规划的思想,还可以在实际应用中提高计算效率。
作为一名程序员,我深刻理解其重要性,并且乐于不断探究和应用这一领域的知识。
通过编写C语言程序实现矩阵链相乘的迭代法求解,我对算法思想和实现方法有了更深入的了解,也提升了自己的编程能力。
四、总结通过本文的探讨,我们对迭代法求解矩阵链相乘问题有了更深入的了解。
我们从问题描述、算法思路、算法实现和个人观点等方面对其进行了全面分析和讨论,并且共享了我个人对该主题的理解和感悟。
希望读者能够通过本文的阅读,更好地理解和运用迭代法求解矩阵链相乘问题,提升自己的编程能力和动态规划算法的应用水平。
在C语言中实现迭代法求解矩阵链相乘问题的算法,能够帮助我们更好地理解动态规划的思想。
c++ 矩阵的乘法C++矩阵的乘法是一种常见且重要的运算技术。
它能够将两个矩阵相乘,产生一个新的矩阵作为结果。
矩阵是一种二维排列的数学结构,由行和列组成。
在计算机科学领域,矩阵被广泛应用于图像处理、物理模拟、数据分析等领域。
因此,了解并掌握矩阵的乘法运算对于C++程序员来说至关重要。
矩阵乘法的基本原理是将两个矩阵中的元素进行相乘,并按照一定的规则将它们相加得到结果矩阵的对应位置元素。
下面就让我们来详细介绍一下C++矩阵的乘法算法及其实现过程。
首先,我们需要定义两个矩阵,并确定它们的维度。
假设第一个矩阵是m×n维度的,第二个矩阵是n×p维度的,那么它们的乘法运算结果将得到一个m×p维度的矩阵。
在C++中,我们可以使用二维数组来表示矩阵。
定义两个二维数组matrix1和matrix2,分别表示两个矩阵。
实际上,我们可以利用C++的vector容器更方便地进行矩阵的表示。
比如,我们可以定义vector<vector<int>> matrix1来表示第一个矩阵。
这样,我们可以通过matrix1[i][j]来访问矩阵中的元素,其中i表示行号,j表示列号。
矩阵的乘法算法可以通过嵌套循环来实现。
首先,我们需要遍历结果矩阵的每个位置。
对于结果矩阵的第i行第j列位置,我们需要计算第一个矩阵的第i行与第二个矩阵的第j列的对应元素的乘积和,并将结果累加得到结果矩阵的对应位置元素。
具体实现时,我们可以使用三个嵌套循环来完成矩阵乘法。
外层两个循环用于遍历结果矩阵的每个位置,内层循环用于计算乘积和。
在内层循环中,我们需要遍历第一个矩阵的第i行和第二个矩阵的第j 列,计算乘积并累加至结果矩阵的对应位置。
下面是C++代码的一个简单示例:```c++#include <iostream>#include <vector>using namespace std;vector<vector<int>>matrixMultiplication(vector<vector<int>>& matrix1,vector<vector<int>>& matrix2) {int m = matrix1.size();int n = matrix1[0].size();int p = matrix2[0].size();vector<vector<int>> result(m, vector<int>(p, 0));for (int i = 0; i < m; i++) {for (int j = 0; j < p; j++) {for (int k = 0; k < n; k++) {result[i][j] += matrix1[i][k] * matrix2[k][j]; }}}return result;}int main() {vector<vector<int>> matrix1 = {{1, 2, 3}, {4, 5, 6}};vector<vector<int>> matrix2 = {{7, 8}, {9, 10}, {11, 12}};vector<vector<int>> result =matrixMultiplication(matrix1, matrix2);for (int i = 0; i < result.size(); i++) {for (int j = 0; j < result[0].size(); j++) {cout << result[i][j] << " ";}cout << endl;}return 0;}```上述代码首先定义了一个matrixMultiplication函数,接收两个矩阵作为参数,并返回它们的乘法结果矩阵。
矩阵在计算机程序中的应⽤先总结⼀下矩阵运算的模版程序求逆的⽅法⽬前不懂,求路过的⼤神解释。
/* 这部分请忽略矩阵相乘有分治来优化的⽅法,Strassen算法,矩阵可以填0的⽅法计算令它成为2^n * 2^n,贴⼀下分治的那部分void Strassen(int n, T A[][N], T B[][N], T C[][N]) {T A11[N][N], A12[N][N], A21[N][N], A22[N][N];T B11[N][N], B12[N][N], B21[N][N], B22[N][N];T C11[N][N], C12[N][N], C21[N][N], C22[N][N];T M1[N][N], M2[N][N], M3[N][N], M4[N][N], M5[N][N], M6[N][N], M7[N][N];T AA[N][N], BB[N][N];if (n == 2) { //2-orderMatrix_Multiply(A, B, C);} else {//将矩阵A和B分成阶数相同的四个⼦矩阵,即分治思想。
for (int i = 0; i < n / 2; i++) {for (int j = 0; j < n / 2; j++) {A11[i][j] = A[i][j];A12[i][j] = A[i][j + n / 2];A21[i][j] = A[i + n / 2][j];A22[i][j] = A[i + n / 2][j + n / 2];B11[i][j] = B[i][j];B12[i][j] = B[i][j + n / 2];B21[i][j] = B[i + n / 2][j];B22[i][j] = B[i + n / 2][j + n / 2];}}//Calculate M1 = (A0 + A3) × (B0 + B3)Matrix_Add(n / 2, A11, A22, AA);Matrix_Add(n / 2, B11, B22, BB);Strassen(n / 2, AA, BB, M1);//Calculate M2 = (A2 + A3) × B0Matrix_Add(n / 2, A21, A22, AA);Strassen(n / 2, AA, B11, M2);//Calculate M3 = A0 × (B1 - B3)Matrix_Sub(n / 2, B12, B22, BB);Strassen(n / 2, A11, BB, M3);//Calculate M4 = A3 × (B2 - B0)Matrix_Sub(n / 2, B21, B11, BB);Strassen(n / 2, A22, BB, M4);//Calculate M5 = (A0 + A1) × B3Matrix_Add(n / 2, A11, A12, AA);Strassen(n / 2, AA, B22, M5);//Calculate M6 = (A2 - A0) × (B0 + B1)Matrix_Sub(n / 2, A21, A11, AA);Matrix_Add(n / 2, B11, B12, BB);Strassen(n / 2, AA, BB, M6);//Calculate M7 = (A1 - A3) × (B2 + B3)Matrix_Sub(n / 2, A12, A22, AA);Matrix_Add(n / 2, B21, B22, BB);Strassen(n / 2, AA, BB, M7);//Calculate C0 = M1 + M4 - M5 + M7Matrix_Add(n / 2, M1, M4, AA);Matrix_Sub(n / 2, M7, M5, BB);Matrix_Add(n / 2, AA, BB, C11);//Calculate C1 = M3 + M5Matrix_Add(n / 2, M3, M5, C12);//Calculate C2 = M2 + M4Matrix_Add(n / 2, M2, M4, C21);//Calculate C3 = M1 - M2 + M3 + M6Matrix_Sub(n / 2, M1, M2, AA);Matrix_Add(n / 2, M3, M6, BB);Matrix_Add(n / 2, AA, BB, C22);//Set the result to C[][N]for (int i = 0; i < n / 2; i++) {for (int j = 0; j < n / 2; j++) {C[i][j] = C11[i][j];C[i][j + n / 2] = C12[i][j];C[i + n / 2][j] = C21[i][j];C[i + n / 2][j + n / 2] = C22[i][j];}}}}算法核⼼就是把每次相乘的8次矩阵相乘变成了7次乘法,看别⼩看这减少的1次乘法,因为每递归1次,性能就提⾼了1/8,⽐如对于1024*1024的矩阵,第1次先分解成7次512*512的矩阵相乘,对于512*512的矩阵,⼜可以继续递归分解成256*256的矩阵相乘,…,⼀直递归下去,假设分解到64*64的矩阵⼤⼩后就不再递归,那么所花的时间将是分块矩阵乘法的(7/8) * (7/8) * (7/8) * (7/8) = 0.586倍,提⾼了快接近⼀倍*/回归正题,看O(n^3)的矩阵乘法,这个在程序⾥就很可以了。
using System;usingSystem.Collections.Generic;usingSystem.Text;namespaceClassMatrix{class Matrix{publicint row, col;public double[,] myMatrix;public Matrix(intMrow, intMcol) //指定行列数创建矩阵,初始值为0矩阵{row = Mrow;col = Mcol;myMatrix = new double[row, col];for (int i = 0; i < row; i++)for (int j = 0; j < col; j++)myMatrix[i, j] = 0;}public static Matrix operator +(Matrix m1, Matrix m2) //矩阵加法{Matrix temp = new Matrix(m1.row, m1.col);if (m1.row == m2.row && m1.col == m2.col){for (int i = 0; i < m1.row; i++)for (int j = 0; j < m2.col; j++)temp.myMatrix[i, j] = m1.myMatrix[i, j] + m2.myMatrix[i, j];}return (temp);}public static Matrix operator +(Matrix m1, double m2) //矩阵加常量{Matrix temp = new Matrix(m1.row, m1.col);for (int i = 0; i < m1.row; i++)for (int j = 0; j < m1.col; j++)temp.myMatrix[i, j] = m1.myMatrix[i, j] + m2;return (temp);}public static Matrix operator -(Matrix m1, Matrix m2) //矩阵减法{Matrix temp = new Matrix(m1.row, m1.col);if (m1.row == m2.row && m1.col == m2.col){for (int i = 0; i < m1.row; i++)for (int j = 0; j < m2.col; j++)temp.myMatrix[i, j] = m1.myMatrix[i, j] - m2.myMatrix[i, j];}return (temp);}public static Matrix operator *(Matrix m1, Matrix m2) //矩阵乘法{int m3r = m1.row;int m3c = m2.col;Matrix m3 = new Matrix(m3r, m3c);if (m1.col == m2.row){double value = 0.0;for (int i = 0; i < m3r; i++)for (int j = 0; j < m3c; j++){for (int ii = 0; ii < m1.col; ii++)value += m1.myMatrix[i, ii] * m2.myMatrix[ii, j];m3.myMatrix[i, j] = value;value = 0.0;}}elsethrow new Exception("矩阵的行/列数不匹配。
cc++矩阵相乘矩阵相乘最重要的方法是一般矩阵乘积。
它只有在第一个矩阵的列(column)和第二个矩阵的行数(row)相同时才有意义。
一般单指矩阵乘积时,指的便是一般矩阵乘积。
一个m×n的矩阵就是m×n 个数排成m行n列的一个数阵。
由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。
运算如下所示:我们可以在2个矩阵上执行加,减,乘和除运算。
从用户输入一行数字和列号,组成第一个矩阵元素和第二个矩阵元素。
然后,对用户输入的矩阵执行乘法。
1.思路首先,由于输入的矩阵维数是随机的,因此,我们要设计程序,手动把行和列算出来,这样方便后续乘法运算。
并且把输入的数字提取出来,放入一个float型数组中,这样我们就完成了读入工作,之后就是利用乘法公式进行运算,并把结果放入一个二维数组中,最后把结果输出来就行了。
2.数据读入这里是容易出现问题的地方,最初的想法是用cin.getline()把整个输入都读进一个char型字符序列中,然后再用特定位置的数做乘法。
后来发现有两个问题,第一,数字读入一个char字符序列中就变成了ASCII码,这个还比较好解决,用每个位置的数减去' 0'就行了。
第二个问题是硬伤,就是把一个数字放到一个char型的序列中,他会把连在一起的数字给拆开,比如说我想输入123,他不会把123放到一个格里,而是1放到一个格,2放入另一个格,3再放一个格。
所以不能放到char[]中。
于是想到把输入放到float数组里,但是这样就有一个新问题,就是如何把符号摘出去。
如果直接用cin,那么碰到符号它并不会跳过,而是也会录入,这是不行的,但是对于这个问题,我们知道输入的格式都是类似于:123,1,2;1,2,3这样的,规律就是一个数字一个符号,我们可以用赋值的方式来跳过,和;的录入。
具体来说就是先用一个cin,把第一个数字录入,然后用c=getchar()的方式来跳过逗号的录入。
Strassen 矩阵相乘算法代码#include<tchar.h>#include<iostream>#include<ctime>#include<Windows.h>usingnamespace std;template<typename T>class Strassen_class {public:void ADD(T** MatrixA, T** MatrixB, T** MatrixResult, int MatrixSize);void SUB(T** MatrixA, T** MatrixB, T** MatrixResult, int MatrixSize);void MUL(T** MatrixA, T** MatrixB, T** MatrixResult, int MatrixSize);//朴素算法实现void FillMatrix(T** MatrixA, T** MatrixB, int length);//A,B矩阵赋值void PrintMatrix(T **MatrixA, int MatrixSize);//打印矩阵void Strassen(int N, T **MatrixA, T **MatrixB, T **MatrixC);//Strassen算法实现};template<typename T>void Strassen_class<T>::ADD(T** MatrixA, T** MatrixB, T** MatrixResult, int MatrixSize) {for (int i = 0; i <MatrixSize; i++){for (int j = 0; j <MatrixSize; j++){MatrixResult[i][j] = MatrixA[i][j] + MatrixB[i][j];}}}template<typename T>void Strassen_class<T>::SUB(T** MatrixA, T** MatrixB, T** MatrixResult, int MatrixSize) {for (int i = 0; i <MatrixSize; i++){for (int j = 0; j <MatrixSize; j++){MatrixResult[i][j] = MatrixA[i][j] - MatrixB[i][j];}}}template<typename T>void Strassen_class<T>::MUL(T** MatrixA, T** MatrixB, T** MatrixResult, int MatrixSize) {for (int i = 0; i<MatrixSize; i++){for (int j = 0; j<MatrixSize; j++){MatrixResult[i][j] = 0;for (int k = 0; k<MatrixSize; k++){MatrixResult[i][j] = MatrixResult[i][j] + MatrixA[i][k] * MatrixB[k][j];}}}}/*c++使用二维数组,申请动态内存方法申请int **A;A = new int *[desired_array_row];for ( int i = 0; i < desired_array_row; i++)A[i] = new int [desired_column_size];释放for ( int i = 0; i < your_array_row; i++)delete [] A[i];delete[] A;*/template<typename T>void Strassen_class<T>::Strassen(int N, T **MatrixA, T **MatrixB, T **MatrixC){int HalfSize = N / 2;int newSize = N / 2;if (N<= 64) //分治门槛,小于这个值时不再进行递归计算,而是采用常规矩阵计算方法{MUL(MatrixA, MatrixB, MatrixC, N);}else{T** A11;T** A12;T** A21;T** A22;T** B11;T** B12;T** B21;T** B22;T** C11;T** C12;T** C21;T** C22;T** M1;T** M2;T** M3;T** M4;T** M5;T** M6;T** M7;T** AResult;T** BResult;//making a 1 diminsional pointer based array.A11 = new T *[newSize];A12 = new T *[newSize];A21 = new T *[newSize];A22 = new T *[newSize];B11 = new T *[newSize];B12 = new T *[newSize];B21 = new T *[newSize];B22 = new T *[newSize];C11 = new T *[newSize];C12 = new T *[newSize];C21 = new T *[newSize];C22 = new T *[newSize];M1 = new T *[newSize];M2 = new T *[newSize];M3 = new T *[newSize];M4 = new T *[newSize];M5 = new T *[newSize];M6 = new T *[newSize];M7 = new T *[newSize];AResult = new T *[newSize];BResult = new T *[newSize];int newLength = newSize;//making that 1 diminsional pointer based array , a 2D pointer based array for (int i = 0; i < newSize; i++){A11[i] = new T[newLength];A12[i] = new T[newLength];A21[i] = new T[newLength];A22[i] = new T[newLength];B11[i] = new T[newLength];B12[i] = new T[newLength];B21[i] = new T[newLength];B22[i] = new T[newLength];C11[i] = new T[newLength];C12[i] = new T[newLength];C21[i] = new T[newLength];C22[i] = new T[newLength];M1[i] = new T[newLength];M2[i] = new T[newLength];M3[i] = new T[newLength];M4[i] = new T[newLength];M5[i] = new T[newLength];M6[i] = new T[newLength];M7[i] = new T[newLength];AResult[i] = new T[newLength];BResult[i] = new T[newLength];}//splitting input Matrixes, into 4 submatrices each.for (int i = 0; i <N / 2; i++){for (int j = 0; j <N / 2; j++){A11[i][j] = MatrixA[i][j];A12[i][j] = MatrixA[i][j + N / 2];A21[i][j] = MatrixA[i + N / 2][j];A22[i][j] = MatrixA[i + N / 2][j + N / 2];B11[i][j] = MatrixB[i][j];B12[i][j] = MatrixB[i][j + N / 2];B21[i][j] = MatrixB[i + N / 2][j];B22[i][j] = MatrixB[i + N / 2][j + N / 2];}}//here we calculate M1..M7 matrices .//M1[][]ADD(A11, A22, AResult, HalfSize);ADD(B11, B22, BResult, HalfSize); //p5=(a+d)*(e+h)Strassen(HalfSize, AResult, BResult, M1); //now that we need to multiply this , we use the strassen itself .//M2[][]ADD(A21, A22, AResult, HalfSize); //M2=(A21+A22)B11 p3=(c+d)*eStrassen(HalfSize, AResult, B11, M2); //Mul(AResult,B11,M2);//M3[][]SUB(B12, B22, BResult, HalfSize); //M3=A11(B12-B22) p1=a*(f-h)Strassen(HalfSize, A11, BResult, M3); //Mul(A11,BResult,M3);//M4[][]SUB(B21, B11, BResult, HalfSize); //M4=A22(B21-B11) p4=d*(g-e)Strassen(HalfSize, A22, BResult, M4); //Mul(A22,BResult,M4);//M5[][]ADD(A11, A12, AResult, HalfSize); //M5=(A11+A12)B22 p2=(a+b)*hStrassen(HalfSize, AResult, B22, M5); //Mul(AResult,B22,M5);//M6[][]SUB(A21, A11, AResult, HalfSize);ADD(B11, B12, BResult, HalfSize); //M6=(A21-A11)(B11+B12)p7=(c-a)(e+f)Strassen(HalfSize, AResult, BResult, M6); //Mul(AResult,BResult,M6);//M7[][]SUB(A12, A22, AResult, HalfSize);ADD(B21, B22, BResult, HalfSize); //M7=(A12-A22)(B21+B22)p6=(b-d)*(g+h)Strassen(HalfSize, AResult, BResult, M7); //Mul(AResult,BResult,M7);//C11 = M1 + M4 - M5 + M7;ADD(M1, M4, AResult, HalfSize);SUB(M7, M5, BResult, HalfSize);ADD(AResult, BResult, C11, HalfSize);//C12 = M3 + M5;ADD(M3, M5, C12, HalfSize);//C21 = M2 + M4;ADD(M2, M4, C21, HalfSize);//C22 = M1 + M3 - M2 + M6;ADD(M1, M3, AResult, HalfSize);SUB(M6, M2, BResult, HalfSize);ADD(AResult, BResult, C22, HalfSize);//at this point , we have calculated the c11..c22 matrices, and now we are going to //put them together and make a unit matrix which would describe our resulting Matrix.//组合小矩阵到一个大矩阵for (int i = 0; i <N / 2; i++){for (int j = 0; j <N / 2; j++){MatrixC[i][j] = C11[i][j];MatrixC[i][j + N / 2] = C12[i][j];MatrixC[i + N / 2][j] = C21[i][j];MatrixC[i + N / 2][j + N / 2] = C22[i][j];}}// 释放矩阵内存空间for (int i = 0; i < newLength; i++){delete[] A11[i]; delete[] A12[i]; delete[] A21[i];delete[] A22[i];delete[] B11[i]; delete[] B12[i]; delete[] B21[i];delete[] B22[i];delete[] C11[i]; delete[] C12[i]; delete[] C21[i];delete[] C22[i];delete[] M1[i]; delete[] M2[i]; delete[] M3[i]; delete[] M4[i];delete[] M5[i]; delete[] M6[i]; delete[] M7[i];delete[] AResult[i]; delete[] BResult[i];}delete[] A11; delete[] A12; delete[] A21; delete[] A22;delete[] B11; delete[] B12; delete[] B21; delete[] B22;delete[] C11; delete[] C12; delete[] C21; delete[] C22;delete[] M1; delete[] M2; delete[] M3; delete[] M4; delete[] M5;delete[] M6; delete[] M7;delete[] AResult;delete[] BResult;}//end of else}template<typename T>void Strassen_class<T>::FillMatrix(T** MatrixA, T** MatrixB, int length){for (int row = 0; row<length; row++){for (int column = 0; column<length; column++){MatrixB[row][column] = (MatrixA[row][column] = rand() % 5);//matrix2[row][column] = rand() % 2;//ba hazfe in khat 50% afzayeshe soorat khahim dasht}}}template<typename T>void Strassen_class<T>::PrintMatrix(T **MatrixA, int MatrixSize){cout << endl;for (int row = 0; row<MatrixSize; row++){for (int column = 0; column<MatrixSize; column++){cout <<MatrixA[row][column] <<"\t";if ((column + 1) % ((MatrixSize)) == 0)cout << endl;}}cout << endl;}int_tmain(int argc, _TCHAR* argv[]){Strassen_class<int> stra;//定义Strassen_class类对象int MatrixSize = 0;int** MatrixA; //存放矩阵Aint** MatrixB; //存放矩阵Bint** MatrixC; //存放结果矩阵clock_t startTime_For_Normal_Multipilication;clock_t endTime_For_Normal_Multipilication;clock_t startTime_For_Strassen;clock_t endTime_For_Strassen;srand(time(0));cout <<"\n请输入矩阵大小(必须是2的幂指数值(例如:32,64,512,..): ";cin >> MatrixSize;int N = MatrixSize;//for readiblity.//申请内存MatrixA = new i nt *[MatrixSize];MatrixB = new i nt *[MatrixSize];MatrixC = new i nt *[MatrixSize];for (int i = 0; i < MatrixSize; i++){MatrixA[i] = new i nt[MatrixSize];MatrixB[i] = new i nt[MatrixSize];MatrixC[i] = new i nt[MatrixSize];}stra.FillMatrix(MatrixA, MatrixB, MatrixSize); //矩阵赋值//*******************conventional multiplication testcout <<"朴素矩阵算法开始时钟: "<< (startTime_For_Normal_Multipilication = clock());stra.MUL(MatrixA, MatrixB, MatrixC, MatrixSize);//朴素矩阵相乘算法 T(n) = O(n^3)cout <<"\n朴素矩阵算法结束时钟: "<< (endTime_For_Normal_Multipilication = clock());cout <<"\n矩阵运算结果... \n";stra.PrintMatrix(MatrixC, MatrixSize);//*******************Strassen multiplication testcout <<"\nStrassen算法开始时钟: "<< (startTime_For_Strassen = clock());stra.Strassen(N, MatrixA, MatrixB, MatrixC); //strassen矩阵相乘算法cout <<"\nStrassen算法结束时钟: "<< (endTime_For_Strassen = clock());cout <<"\n矩阵运算结果... \n";stra.PrintMatrix(MatrixC, MatrixSize);cout <<"矩阵大小 "<< MatrixSize;cout <<"\n朴素矩阵算法: "<< (endTime_For_Normal_Multipilication -startTime_For_Normal_Multipilication) <<" Clocks.."<< (endTime_For_Normal_Multipilication - startTime_For_Normal_Multipilication) / CLOCKS_PER_SEC<<" Sec";cout <<"\nStrassen算法:"<< (endTime_For_Strassen - startTime_For_Strassen) <<" Clocks.."<< (endTime_For_Strassen - startTime_For_Strassen) / CLOCKS_PER_SEC<<" Sec\n";system("Pause");return 0;}。