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

C++中实现数组变形,求极值并返回其行列号

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

前言

今天更新内容主要还是实现数组的变形,在Python中一个函数Reshape的事,在C++耗费了我两个多小时,可能是我C++基础差吧, :mad: 怪我大一,大二没好好学 :cry: 。本次还有一个很重要的内容就是用C++的“new”创建动态数组,在上一篇C++文章中是用的C语言的“malloc”实现数组地址的动态分配,在一个就是用指针来对数组操作,这些很简单的操作,我还要在大三重新认识,惭愧至极,话不多说,直接上代码。

代码


/*
作者:山科_xxin
时间:2017-03-14 23:27:40
功能:数组变形,求数组极值及其下标
类别:C++数组练习
*/

#include<iostream>
#include<stdlib.h>
#include<ctime>
using namespace std;

int **random(int n,int m)
{
	int t;
	int **data;
	t = time(0);
	srand(t);
	data=(int **)malloc(n*sizeof(int *));
	for (int i=0;i<n;i++)  
        data[i]=(int *)malloc(2*sizeof(int));
	for(int i = 0;i<n;i++)
	{
		for(int j = 0;j<m;j++)
		{
			data[i][j] = rand()%100;
		}
	}
	return data;
}

int visit(int **data,int n,int m)
{
	for(int i = 0;i<n;i++)
	{
		for(int j = 0;j<m;j++)
			cout<<data[i][j]<<" ";
		cout<<endl;
	}
	
	return 0;

}

int **reshape(int **data,int n,int m,int x,int y )
{
	int k = 0;
	int *midata = new int[n*m];
	int **redata = new int *[x];
	if (n*m!=x*y)
		cout<<"reshap失败,非法输入";
	else
	{
	for( int i=0; i<x; i++ )
	{
	   redata[i] = new int[y]  ;
	}
	int redata1[3][2];
	for(int i = 0;i<n;i++)
	{
		for(int j = 0;j<m;j++)
		{
			k++;
			*(midata+k) = data[i][j];
		}	
	}
	
	int k1 = 0;
	/*
	for(int i = 0;i<n*m;i++)
	{
		
		k1++;
		cout<<*(midata+k1)<<" ";
		//cout<<midata[k1]<<" ";
	}
	cout<<endl;
	*/
	int k2 = 0;
	for(int ii = 0;ii<x;ii++)
	{
		
		for(int jj = 0;jj<y;jj++)
		{
			//cout<<midata[ii*y+jj+1]<<" ";

			//redata[ii][jj] = midata[ii*y+jj+1];
			//cout<<redata[ii][jj];
			redata[ii][jj] = midata[ii*y+jj+1];
			//cout<<redata[ii][jj]<<" ";
		}
		//cout<<endl;
	}
	}
	for(int i = 0; i < x; i++)
	return redata;
}

int *Max(int **data,int n,int m)
{
	int maxv = -999;
	int maxi = 0,maxj = 0;
	int *max = new int[3];
	for(int i = 0;i<n;i++) 
	{
		for(int j = 0;j<m;j++)
		{
			if (data[i][j]>=maxv)
			{
				maxv = data[i][j];
				maxi = i;
				maxj = j;
			}
		}
	}
	*max = maxv;
	*(max+1) = maxi;
	*(max+2) = maxj;
	return max;
}

int *Min(int **data,int n,int m)
{
	int minv = 999;
	int mini = 0,minj = 0;
	int *min = new int[3];

	for(int i = 0;i<n;i++) 
	{
		for(int j = 0;j<m;j++)
		{
			if (data[i][j]<=minv)
			{
				minv = data[i][j];
				mini = i;
				minj = j;
			}
				

		}
	}
	*min = minv;
	*(min+1) = mini;
	*(min+2) = minj;
	return min;
}

int main() 
{  

	int n,m,x,y;
	int maxv,minv;
	cout<<"请输入行数,列数"<<endl;
	cin>>n;
	cin>>m;
	int *min;
	int *max;
	cin>>x;
	cin>>y;
	int **data = random(n,m);
	int **redata = reshape(data,n,m,x,y);
	cout<<"原始数组"<<endl;
	visit(data,n,m);
	cout<<"变形后"<<endl;
	visit(redata,x,y);
	min = Min(data,n,m);
	max = Max(data,n,m);
	cout<<"min:"<<min[0]<<" "<<"i:"<<min[1]<<" "<<"j:"<<min[2]<<endl;
	cout<<"max:"<<max[0]<<" "<<"i:"<<max[1]<<" "<<"j:"<<max[2]<<endl;
	system("pause");
	return 0;
}  

演示

main函数

main函数
运行结果

运行结果
注:生成3*6的随机数组,变形为9*2数组,求原数组的最大值,最小值,并返回其坐标。

后语

用C++写一个图像处理算法,肯定是一个庞大的工程,用解释性语言,比如Python,能轻松处理数组,使你更专注于算法的实现,但是C语言速度更快,比如说C语言0.001s完成的任务,Python可能需要0.1s,但是你基本察觉不出来,并且C++还有编译的过程,而Python直接运行。


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

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

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