注册 登录
  • 注册时,本站名称为:RGB空格3S博客,注意中间的空格。
  • 2018.8.14本站全面接入google广告
  • 2017.2.14今天收到45条恶意评论(全是外文),故评论时请填写必要信息,匿名评论全部拉黑,迫不得已而为之
  • 2017.1.27,2017年春节及至,我谨代表本人祝大家新春快乐,本人年终总结文章请访问:2016年终总结
  • 为防止恶意转载,本站全面禁止复制,并添加图片水印:RGB 3S博客www.ixxin.cn。
  • 本站正式更名为RGB 3S博客,本站将撤消所有非3S内容,其将转移到新博客江湖时代

C++数组运算以及矩阵乘法

C/C++ admin 6584次浏览 已收录 0个评论
[隐藏]

前言

今天周六,时间多,写了一会,发现之前写的reshape有点问题,本次更新就是定义了数组以及矩阵,数组的四则运算,以及矩阵的乘法,并且定义单个指针的是数组,两个指针的是矩阵,完成了矩阵的转置,指针来指针去,把我搞糊涂了。。。

代码

/*
作者:山科_xxin
时间:2017-03-18 23:14:51
功能:矩阵转置,数组运算,矩阵乘法
类别:C++矩阵,数组练习
*/
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int** Matt;
typedef int* Arrr;
template <class T>

int *getArrayLen(T& array)

{
	int len;
	int row;
	int col;
	int len1;
	int Len[3];
	len = sizeof(array)/sizeof(int);
	col = sizeof(array[0])/sizeof(int);
	row = len/col;
	Len[0] = len;
	Len[1] = row;
	Len[2] = col;
	return Len;

}

class Matrix
{
public:
	int visitM(int **Mat,int row,int col);
	int **Trans(int *Mat,int row,int col);
	int **mult(int **Mat,int **Mat2,int row1,int col1,int row2,int col2);
};

int Matrix::visitM(int **Arr,int row,int col)
{
	for(int i = 0;i<row;i++)
	{
		for(int j = 0;j<col;j++)
		{
			cout<<Arr[i][j]<<" ";
		}
		cout<<endl;
	}

	return 0;
}

int **Matrix::Trans(int *Mat,int row,int col)
{
	int **Mat2 = new int*[col];
	for(int i = 0;i<col;i++)
		Mat2[i] = new int[row];
	for(int i=0;i<row;i++)
	{
		for(int j = 0;j<col;j++)
		{
			Mat2[j][i] = Mat[i*col+j];
		}
	}
	return Mat2;
}

int **Matrix::mult(int **Mat1,int **Mat2,int row1,int col1,int row2,int col2)
{
	int **Mat3 = new int*[100];
	for(int i = 0;i<100;i++)
		Mat3[i] = new int[100]();
	//int value  = 0;
	if (col1!=row2)
	{
		cout<<"输入矩阵非法"<<endl;
		exit(0);
	}

	else
	{
		for(int i = 0;i<row1;i++)
		{
			for (int j = 0;j<col2;j++)
			{
				for(int k = 0;k<col1;k++)
				{
					Mat3[i][j] += Mat1[i][k]*Mat2[k][j];
				}
			}
		}
	}
	return Mat3;
}

class ArrT
{
public:
	int visitA(int *Arr,int row,int col);
	int **Z(int *Arr,int row,int col);
	int *Sum(int *Arr,int row,int col);
	int **arrmul(int *Arr1,int *Arr2,int row,int col);
	int **arrsub(int *Arr1,int *Arr2,int row,int col);
	int **arrmult(int *Arrl,int *Arr2,int row,int col);
};

int **ArrT::Z(int *Arr,int row,int col)
{
	int **Mat2 = new int*[row];
	for(int i = 0;i<row;i++)
		Mat2[i] = new int[col];
	for(int i = 0;i<row;i++)
	{
		for(int j = 0;j<col;j++)
			Mat2[i][j] = Arr[i*col+j];
	}

	return Mat2;
}

int ArrT::visitA(int *Arr,int row,int col)
{
	for(int i = 0;i<row;i++)
	{
		for(int j = 0;j<col;j++)
		{
			cout<<Arr[i*col+j]<<" ";
		}
		cout<<endl;
	}

	return 0;
}

int *ArrT::Sum(int *Arr,int row,int col)
{
	int he = 0;
	int *herow = new int[100];
	*herow = 0;
	int value = 0;
	for (int i = 0;i<row;i++)
	{
		for(int j = 0;j<col;j++)
		{
			herow[i] += *(Arr+j);
		}
	}
	return herow;
}

int **ArrT::arrmul(int *Arr1,int *Arr2,int row,int col)
{
	int **Arr3 = new int*[row];
	for(int i = 0;i<row;i++)
		Arr3[i] = new int[col];
	for(int i = 0;i<row;i++)
		for(int j = 0;j<col;j++)
		{
			Arr3[i][j] = Arr1[i*col+j]+Arr2[i*col+j];
		}
	return Arr3;
}

int **ArrT::arrmult(int *Arr1,int *Arr2,int row,int col)
{
	int **Arr3 = new int*[row];
	for(int i = 0;i<row;i++)
		Arr3[i] = new int[col];
	for(int i = 0;i<row;i++)
		for(int j = 0;j<col;j++)
		{
			Arr3[i][j] = Arr1[i*col+j]*Arr2[i*col+j];
		}
	return Arr3;
}

int **ArrT::arrsub(int *Arr1,int *Arr2,int row,int col)
{
	int **Arr3 = new int*[row];
	for(int i = 0;i<row;i++)
		Arr3[i] = new int[col];
	for(int i = 0;i<row;i++)
		for(int j = 0;j<col;j++)
		{
			Arr3[i][j] = Arr1[i*col+j]-Arr2[i*col+j];
		}
	return Arr3;
}

int main()
{
	ArrT arr;
	Matrix mat;
	Arrr len;
	int row;
	int col;
	Arrr sum;
	Matt mul;
	Matt T;
	Matt arrz;
	Matt result;
	Matt c;
	int a[2][3] = {{1,2,3},{4,5,6}};
	int b[2][3] = {{2,6,9},{2,6,4}};
	len = getArrayLen(a);
	row = len[1];
	col = len[2];
	cout<<"行:"<<row<<" "<<"列:"<<col<<endl;
	cout<<"原数组:"<<endl;
	arr.visitA(*a,row,col);
	mul = arr.arrmul(*a,*b,row,col);
	arrz = arr.Z(*a,row,col);
	T = mat.Trans(*a,row,col);
	cout<<"转置后:"<<endl;
	mat.visitM(T,col,row);
	cout<<"转置后矩阵*原矩阵"<<endl;
	result = mat.mult(T,arrz,col,row,row,col);
	mat.visitM(result,col,col);
	c = arr.arrmult(*a,*b,row,col);
	cout<<"a数组*b数组"<<endl;
	mat.visitM(c,row,col);
	system("pause");
	return 0;
}

main函数:

main
结果

结果

后语

有了这些基本操作的函数,就可以安心写算法了。明天研究Opencv 仿射变换。


xxin blog , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++数组运算以及矩阵乘法
喜欢 (0)
支付宝[853060844@qq.com]
分享 (0)
admin
关于作者:
坐标山科大遥感系小鲜肉一枚。
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址