116.复矩阵乘法

#include "stdio.h"
#define MAX 255

void CMatrixMul(ar,ai,br,bi,m,n,k,cr,ci) /*复矩阵相乘*/
int m,n,k; /*m是矩阵A的行数,n是矩阵B的行数,k是矩阵B的列数*/
/*ar,br,cr分别是矩阵A,B,C的实部,ai,bi,ci分别是矩阵A,B, C的虚部*/
double ar[],ai[],br[],bi[],cr[],ci[];
{
	int i,j,l,u,v,w;
    	double p,q,s;
    	for (i=0; i<=m-1; i++)
		for (j=0; j<=k-1; j++)
		{
			u=i*k+j;
        		cr[u]=0.0; ci[u]=0.0;
        		for (l=0; l<=n-1; l++)
			{
				v=i*n+l; w=l*k+j;
				p=ar[v]*br[w];
				q=ai[v]*bi[w];
				s=(ar[v]+ai[v])*(br[w]+bi[w]);
				cr[u]=cr[u]+p-q;
				ci[u]=ci[u]+s-p-q;
			}
		}
	return;
}
print_matrix(A,m,n)/*打印的矩阵A(m*n)的元素*/
int m,n; /*矩阵的阶数*/
double A[]; /*矩阵A*/
{
	int i,j;
	for (i=0; i<m; i++)
	{
		for (j=0; j<n; j++)
			printf("%13.7f\t",A[i*n+j]);
		printf("\n");
	}
}
main()
{
	int i,j,n,m,k;
	double Ar[MAX],Br[MAX],Cr[MAX],Ai[MAX],Bi[MAX],Ci[MAX];
	static double cr[3][4],ci[3][4];
	static double ar[3][4]={ {1.0,2.0,3.0,-2.0}, /*矩阵A的实部*/
							{1.0,5.0,1.0,3.0},
							{0.0,4.0,2.0,-1.0}};
	static double ai[3][4]={ {1.0,-1.0,2.0,1.0}, /*矩阵A的虚部*/
							{-1.0,-1.0,2.0,0.0},
							{-3.0,-1.0,2.0,2.0}};
	static double br[4][4]={ {1.0,4.0,5.0,-2.0}, /*矩阵B的实部*/
							{3.0,0.0,2.0,-1.0},
							{6.0,3.0,1.0,2.0},
							{2.0,-3.0,-2.0,1.0}};
	static double bi[4][4]={ {-1.0,-1.0,1.0,1.0}, /*矩阵B的虚部*/
							{2.0,1.0,0.0,5.0},
							{-3.0,2.0,1.0,-1.0},
							{-1.0,-2.0,1.0,-2.0}};
	clrscr();
	puts("**********************************************************");
	puts("*    This is a complex-matrix-multiplication program.    *");
	puts("*    It calculate the two matrixes C(m*k)=A(m*n)B(n*k).  *");
	puts("**********************************************************");
	printf(" >> Please input the number of rows in A, m= ");
	scanf("%d",&m);
	printf(" >> Please input the number of cols in A, n= ");
	scanf("%d",&n);
	printf(" >> Please input the number of cols in B, k= ");
	scanf("%d",&k);
	printf(" >> Please input the %d elements in Ar one by one:\n >> ",m*n);
	for(i=0;i<m*n;i++)
		scanf("%lf",&Ar[i]);
	printf(" >> Please input the %d elements in Ai one by one:\n >> ",m*n);
	for(i=0;i<m*n;i++)
		scanf("%lf",&Ai[i]);
	printf(" >> Please input the %d elements in Br one by one:\n >> ",n*k);
	for(i=0;i<n*k;i++)
		scanf("%lf",&Br[i]);
	printf(" >> Please input the %d elements in Bi one by one:\n >> ",n*k);
	for(i=0;i<n*k;i++)
		scanf("%lf",&Bi[i]);
	CMatrixMul(Ar,Ai,Br,Bi,m,n,k,Cr,Ci); /*进行计算*/
	/*输出乘积结果的实部*/
	printf(" Real part of C(%d*%d)=A(%d*%d)*B(%d*%d):\n",m,k,m,n,n,k);
	print_matrix(Cr,m,k);
	/*输出乘积结果的虚部*/
	printf(" Complex part of C(%d*%d)=A(%d*%d)*B(%d*%d):\n",m,k,m,n,n,k);
	print_matrix(Ci,m,k);
	printf(" Press any key to quit...");
	getch();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程与实战

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值