C++类实现矩阵乘法(一二维数组)

有关矩阵

用类和运算符重载,写矩阵乘法(一维&二维数组)

一维数组

#include<iostream>

class jz{
	public:
		int h,l;
		int *A;
	
		jz(int a,int b):h(a),l(b){
			A = new int [h*l];
		}
		void set(int *a);
		void print(void);
		friend jz operator * (jz a1,jz a2);
		
		
}; 

void jz::set(int *a){
	for(int i=0;i<h*l;i++){
		A[i]=a[i];
	}
}

void jz::print(void){
	for(int i=0;i<h;i++){
		for(int j=0;j<l;j++){
			printf("%d ",A[i*l+j]);
		}
		printf("\n");
	}
}

jz operator * (jz a1,jz a2){
	jz C(a1.h,a2.l); //a1.h=3,a2.l=2
	int a[a1.h*a2.l];
	for(int i=0;i<a1.h*a2.l;i++){
		int q=0,q_h,q_l;
		q_h=i/a2.l;
		q_l=i%a2.l;
		for(int j=0;j<a1.l;j++){
			q+=a1.A[q_h*a1.l+j]*a2.A[a2.l*j+q_l];
			//printf("%d\n",q);
		}
		a[i]=q;
		//printf("%d ",a[i]);
	}
	C.set(a);
	return C;
}

int main()
{
	jz a(3,4),b(4,2),c(3,2);
	int S1[12]={3,0,0,7,0,0,0,-1,0,2,0,0};
	int S2[8]={4,1,0,0,1,-1,0,2};
	
	a.set(S1);
	b.set(S2);
	
//	a.print();
//	b.print();
	
	c=a*b;
	c.print();
	return 0;
}

二维数组

#include<iostream>

class jz{
	public:
		int h,l;
		int **A;
		
		jz(int a,int b);
		~jz(void); 
		void set(int *a,int n);
		void print(void);
		jz operator * (jz a);
};

jz::jz(int a,int b):h(a),l(b){
	A = new int*[h];  //长度为行数的数组指针空间,每一个指针都对应一个有列个数的数组 
	for(int i=0;i<h;i++){
		A[i]= new int [l];
	}
}

jz::~jz(){
	for(int i=0;i<h;i++){
		delete []A[i];
	}
	delete []A;
}

void jz::set(int *a,int n){
	//printf("%d,%d\n",h,l);
	int p=0;
		for(int i=0;i<h;i++){
			for(int j=0;j<l;j++){
				A[i][j]=a[p];
				p++;
			}
		}
	
}

void jz::print(){
	for(int i=0;i<h;i++){
		for(int j=0;j<l;j++){
			printf("%d ",A[i][j]);
		}
		printf("\n");
	}
}

jz jz::operator *(jz a){
	jz c(h,a.l);
	for(int i=0;i<h;i++)
	{
		for(int j=0;j<a.l;j++)
		{
			for(int k=0;k<l;k++)
			{
				c.A[i][j]+=A[i][k]*a.A[k][j];
				//printf("%d,%d,%d\n",c.A[i][j],A[i][k],a.A[k][j]);
			}
		}
	}
	return c;
}

int main()
{
	jz a(3,4),b(4,2),c(3,2);
	int S1[12]={3,0,0,7,0,0,0,-1,0,2,0,0};
	int S2[8]={4,1,0,0,1,-1,0,2};
	
	a.set(S1,12);
	b.set(S2,8);
	
	a.print();
	printf("\n");
	b.print();
	printf("\n");
	
	c=a*b;
	
	c.print();
	
	return 0;
}
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值