矩阵的幂运算——C语言实现

如题所述

矩阵的幂运算——C语言实现方式解说如下:

引入

在写离散数学的作业时,题目要求图的邻接矩阵的幂,例如:

像这样的计算没有是枯燥乏味的,所以我决定让计算机去解决它。

矩阵的乘法和幂运算

两个矩阵的乘法仅当第一个矩阵A的列数和另一个矩阵B的行数相等时才能定义。如A是m×n矩阵和B是n×p矩阵,它们的乘积C是一个m×p矩阵C=Cij。

计算情况像这样:

由此我们可以总结出矩阵的乘法和幂运算的一些基本规则:

设矩阵M1,M2,res。

1、能够计算M1*M2的前提是M1的列数等于M2的行数。

2、设res=M1*M2,那么res的行数等于M1的行数,res的列数等于M2的列数。

如何实现

我们用一个结构体来表示一个矩阵,结构体中的matrix指向一个一维指针数组,一维指针数组中的每一个元素是指向一个整型的int数组,通过这样让matrix指针能够访问表示矩阵的二维数组的每一个元素。

计算矩阵的幂运算可以通过递归来实现:

假设要计算矩阵M的n次幂。

1、n为偶数,要计算M的n次幂,那么可以先计算M的n2次幂,再将两个M的n2次幂相乘就可以得到M的n次幂。

而计算M的n2次幂也同样可以利用前面的逻辑进行计算,也就是说可以通过递归来计算M的n次幂。

2、n为奇数,那么n+1为偶数,那么可以通过①中的方法先计算M的(n+1)/2次幂,再用矩阵的乘法将结果和矩阵M相乘即可得到M的n+1次幂。

代码实现

从上面的推理可以知道我们需要实现以下功能:

1、创建矩阵。

2、矩阵的乘法。

3、矩阵的幂运算。

而且我们可以知道矩阵的幂运算是需要用到矩阵的乘法的,当计算矩阵的奇数次幂时需要用到矩阵的乘法。

由于矩阵的幂运算通过递归进行,那么在计算过程中一些矩阵对接下来的计算无用时,我们需要把它释放掉,防止出现内存泄漏,因此还需要实现。

4、矩阵的释放。

这里我给出我的代码成果:

代码测试

对照上面的测试用例,可以发现是完全符合的。获取代码。

以上就是矩阵的幂运算的全部内容,希望对你有帮助。

温馨提示:内容为网友见解,仅供参考
无其他回答

矩阵的幂运算——C语言实现
1、创建矩阵。2、矩阵的乘法。3、矩阵的幂运算。而且我们可以知道矩阵的幂运算是需要用到矩阵的乘法的,当计算矩阵的奇数次幂时需要用到矩阵的乘法。由于矩阵的幂运算通过递归进行,那么在计算过程中一些矩阵对接下来的计算无用时,我们需要把它释放掉,防止出现内存泄漏,因此还需要实现。4、矩阵的释放。...

矩阵的幂运算——C语言实现
递归探索: 矩阵幂运算的递归之路,如同解开神秘的密码,偶数次幂通过两次递归调用轻松实现,而奇数次幂则像一场优雅的舞蹈,先一步的平方再与原矩阵共舞。功能全方位: 从矩阵的诞生到消失,我们精心打造——创建、乘法、幂运算,最后是释放内存,每一个步骤都充满科技的魅力。代码实例: 实现矩阵乘方运算的...

如何用c语言中的函数递归调用算法实现n阶矩阵的n次幂的求解?
c[i * k + u] = x;}

C语言,矩阵的布尔幂.
\/* Note:Your choice is C IDE *\/ include <stdio.h> void boolMatrix(int A[3][2],int B[3][2]){int i,j,RAnd[3][2],ROr[3][2];for(i=0;i<3;++i){ for(j=0;j<2;++j){ RAnd[i][j]=A[i][j]&B[i][j];ROr[i][j]=A[i][j]|B[i][j];} } for(i=0...

如何用c语言中的函数递归调用算法实现n阶矩阵的n次幂的求解?
\/*用c语言中的函数递归调用算法实现n阶矩阵的n次幂*\/#include <stdio.h>#include <stdlib.h>#include #include <string.h>\/\/创建矩阵,矩阵用一维数组存储double *matCreate(unsigned int m, unsigned int n){ double *p = (double *)malloc(sizeof(double) * m * n); if (p ==...

C语言矩阵运算怎么实现
C语言示例代码如下:include<stdio.h> int main(){int i,sumX=0,sumY=0,sum=0;int num[5][5]= {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};for(i=0;i<5;i++){\/\/计算对角线 sumX+=num[i][i];sumY+=num[5-i][i...

急急急!!!设计一个矩阵运算器,对矩阵进行乘方(^)、加(+)、减(-)、乘...
int main(){ int n;scanf("%d",&n);read(a,n,n);read(b,n,n);add(a,b,c,n,n);\/\/加法 out(c,n,n);minus(a,b,c,n,n);\/\/减法 out(c,n,n);\/\/输出 multi(a,b,c,n,n);\/\/乘法 out(c,n,n);MatrixPow(a,3,c,n,n);\/\/a的三次方 out(c,n,n);return 0;} ...

矩阵a是2*4矩阵,矩阵b是4*2矩阵,用c语言编程实现c=a*b
include <stdlib.h> \/\/矩阵a是2*4矩阵,矩阵b是4*2矩阵,用c语言编程实现c=a*b void main(){ int a[2][4],b[4][2],c[2][2],i,j,k;srand(time(0));for(i=0;i<4;i++)for(j=0;j<2;j++){ b[i][j]=rand()%10;\/\/给a,b数组赋值 a[j][i]=rand()%10;} prin...

用c语言编写矩阵的加减乘除运算
using namespace std;template <typename T1,typename T2> void inverse(T1*mat1,T2 *mat2,int a,int b);template <typename T1,typename T2> void multi(T1*mat1,T2*mat2,T2*result,int a,int b,int c);template <typename T> void output(T*mat,char *s,int a,int b);int main()...

(c语言)C语言实现矩阵相乘.不知道哪错了
printf("\\n请输入B矩阵%d元素",n*s);scanfmatrix(B,m,n); \/\/\/这里不应该是 B,n,s吗?printf("\\nB矩阵元素;\\n");printfmatrix(B,m,n); \/\/\/这里不应该是 B,n,s吗?

相似回答
大家正在搜