⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comput.cpp

📁 基于小波的SAR斑点处理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "stdafx.h"
#include <math.h>
#include "Comput.h"

#define EPS 0.000001
#define PI 3.1415926

// 分布表
static double F_DISTR[31][9] ={
	{161.4,199.5,215.7,224.6,230.2,234.0,236.8,238.9,243.9},
	{18.5, 19.0, 19.2, 19.2, 19.3, 19.3, 19.4, 19.4, 19.4},
	{10.1, 9.55, 9.28, 9.12, 9.01, 8.94, 8.89, 8.85, 8.74},
	{7.71, 6.94, 6.59, 6.39, 6.26, 6.16, 6.09, 6.04, 5.91},
	{6.61, 5.79, 5.41, 5.19, 5.05, 4.95, 4.88, 4.82, 4.68},
	{5.99, 5.14, 4.76, 4.53, 4.39, 4.28, 4.21, 4.15, 4.00},
	{5.59, 4.74, 4.35, 4.12, 3.97, 3.87, 3.79, 3.73, 3.57},
	{5.32, 4.46, 4.07, 3.84, 3.69, 3.58, 3.50, 3.44, 3.28},
	{5.12, 4.26, 3.86, 3.63, 3.48, 3.37, 3.29, 3.23, 3.04},
	{4.96, 4.10, 3.71, 3.48, 3.33, 3.22, 3.14, 3.07, 2.91},
	{4.84, 3.98, 3.59, 3.36, 3.20, 3.09, 3.01, 2.95, 2.79},
	{4.75, 3.89, 3.49, 3.26, 3.11, 3.00, 2.91, 2.85, 2.69},
	{4.67, 3.81, 3.41, 3.18, 3.03, 2.92, 2.83, 2.77, 2.60},
	{4.60, 3.74, 3.34, 3.11, 2.96, 2.85, 2.76, 2.70, 2.53},
	{4.54, 3.68, 3.29, 3.06, 2.90, 2.79, 2.71, 2.64, 2.48},
	{4.49, 3.63, 3.24, 3.01, 2.85, 2.74, 2.66, 2.59, 2.42},
	{4.45, 3.59, 3.20, 2.96, 2.81, 2.70, 2.61, 2.55, 2.38},
	{4.41, 3.55, 3.16, 2.93, 2.77, 2.66, 2.58, 2.51, 2.34},
	{4.38, 4.52, 3.13, 2.90, 2.74, 2.63, 2.54, 2.48, 2.31},
	{4.35, 3.49, 3.10, 2.87, 2.71, 2.60, 2.51, 2.45, 2.28},
	{4.32, 3.47, 3.07, 2.84, 2.68, 2.57, 2.49, 2.42, 2.25},
	{4.30, 3.44, 3.05, 2.82, 2.66, 2.55, 2.46, 2.40, 2.34},
	{4.28, 3.42, 3.03, 2.80, 2.64, 2.53, 2.44, 2.37, 2.20},
	{4.26, 3.40, 3.01, 2.78, 2.62, 2.51, 2.42, 2.36, 2.29},
	{4.24, 3.39, 2.99, 2.76, 2.60, 2.49, 2.40, 2.34, 2.16},
	{4.23, 3.37, 2.98, 2.74, 2.59, 2.47, 2.39, 2.32, 2.15},
	{4.21, 3.35, 2.96, 2.73, 2.57, 2.46, 2.37, 2.31, 2.13},
	{4.20, 3.34, 2.95, 2.71, 2.56, 2.43, 2.36, 2.29, 2.12},
	{4.18, 3.33, 2.93, 2.70, 2.55, 2.42, 2.35, 2.28, 2.10},
	{4.17, 3.32, 2.92, 2.69, 2.53, 2.34, 2.33, 2.27, 2.09},
	{4.08, 3.23, 2.84, 2.61, 2.45, 2.25, 2.25, 2.18, 2.00}
};

// 查找分布表
double look_up(int n,int m)
{
 if(n>8)
	n = 9;
 if(m>30)
	m = 31;
 return (double)F_DISTR[m-1][n-1];
}

// 查找最大的双精度数,并返回其在数组中的位置
int max_i(double *x,int n)
{
	int i;
	int l=0;
	for(i=1; i<n; i++)
	{
		if(*(x+l)<*(x+i))
		l=i;
	}
	return l;
}

// 查找最大的双精度数,并返回其值
double  max_f(double *x,int n)
{
	return *(x+max_i(x,n));
}

// 查找最小的双精度数,并返回其在数组中的位置
int  min_i(double *x,int n)
{
	int i;
	int l=0;
	for(i=1;i<n;i++)
	{
		if(*(x+l)>*(x+i))
		l=i;
	}
	return l;
}

// 查找最小的双精度数,并返回其值
double  min_f(double *x,int n)
{
	return *(x+min_i(x,n));
}

// 求某双精度数的平方
double  sqr(double x)
{
	return x*x;
}

// 求1-n的自然数列的和
int  add(int n)
{
	return n*(n+1)/2;
}

// 求均值 
BYTE  mean(BYTE *p,int m)
{
	long int s=0;
	int i;
	for(i=0;i<m;i++)
		s+=*(p+i);
	return (BYTE)(s/m);
}

// 求中值
BYTE  media(BYTE *data,int num)
{
	BYTE temp;
	int i,j;
	for(i=0;i<num;i++)
	for(j=i;j<num;j++)
		if(*(data+j)>*(data+i))
		{
			temp=*(data+j);
			*(data+j)=*(data+i);
			*(data+i)=temp;
		}
	if(num%2 == 1)
		return data[num/2];
	else
		return (BYTE)(((double)data[num/2]+(double)data[num/2-1])/2);
}

// 求中值
float  mediaF(float *data,int num)
{
	float temp;
	int i,j;
	for(i=0;i<num;i++)
	for(j=i;j<num;j++)
		if(*(data+j)>*(data+i))
		{
			temp=*(data+j);
			*(data+j)=*(data+i);
			*(data+i)=temp;
		}
	if(num%2 == 1)
		return data[num/2];
	else
		return (float)(((double)data[num/2]+(double)data[num/2-1])/2);
}


// 求众数
BYTE  many(BYTE *data,int num)
{
	int t,w;
	BYTE md,oldmode;
	int count,oldcount;
	oldmode=0;
	oldcount=0;
	for(t=0; t<num; t++)
	{
		md=data[t];
		count=1;
		for(w=t+1; w<num; w++)
			if(md == data[w])
				count++;
		if(count>oldcount)
		{
			oldmode=md;
			oldcount=count;
		}
	}
	return oldmode;
}

// 数据块转赋值
void  assign(double *x1,double *x2,int n,int m)
{
	int i,j;
	for(i=0; i<n; i++)
	{
		for(j=0; j<m; j++)
			x2[i*m+j] = x1[i*m+j];
	}
}

// 返回数的符号:1—正数,0—零,-1—负数
double sign(double x)
{
	if(x>0)
		return 1.0;
	else if(x<0)
		return -1.0;
	else
		return 0.0;
}

// 求双精度数组的和
double sum(float *x,int n)
{
	double s=0;
	int i;
	for(i=0;i<n;i++)
		s+=(*(x+i));
	return s;
}

// 求协方差值*n
double l(float *x1,float *x2,int n)
{
	double medx1,medx2;
	int i;
	double s=0;
	medx1=sum(x1,n)/n;
	medx2=sum(x2,n)/n;
	for(i=0;i<n;i++)
		s+=(*(x1+i)-medx1)*(*(x2+i)-medx2);
	return s;
}

// 求相关系数
double relate(float *x1,float * x2,int n)
{
	return l(x1,x2,n)/sqrt(l(x1,x1,n)*l(x2,x2,n));
}

// 求双精度数组的和
double sum(double *x,int n)
{
	double s=0;
	int i;
	for(i=0;i<n;i++)
		s+=(*(x+i));
	return s;
}

// 求协方差值*n
double l(double *x1,double *x2,int n)
{
	double medx1,medx2;
	int i;
	double s=0;
	medx1=sum(x1,n)/n;
	medx2=sum(x2,n)/n;
	for(i=0;i<n;i++)
		s+=(*(x1+i)-medx1)*(*(x2+i)-medx2);
	return s;
}

// 求相关系数
double relate(double *x1,double * x2,int n)
{
	return l(x1,x2,n)/sqrt(l(x1,x1,n)*l(x2,x2,n));
}

// 求双精度数组的和
double sum(BYTE *x,int n)
{
	double s=0;
	int i;
	for(i=0;i<n;i++)
		s+=(*(x+i));
	return s;
}

// 求协方差值*n
double l(BYTE *x1,BYTE *x2,int n)
{
	double medx1,medx2;
	int i;
	double s=0;
	medx1=sum(x1,n)/n;
	medx2=sum(x2,n)/n;
	for(i=0;i<n;i++)
		s+=(*(x1+i)-medx1)*(*(x2+i)-medx2);
	return s;
}

// 求相关系数
double relate(BYTE *x1,BYTE * x2,int n)
{
	return l(x1,x2,n)/sqrt(l(x1,x1,n)*l(x2,x2,n));
}

// 转赋数据块的值
void trn(double *x1,double *x2,int n1,int m1)
{
	int t1,t2;
	for(t1=0;t1<m1;t1++)
	{
		for(t2=0;t2<n1;t2++)
		{
			x2[t1*n1+t2] = x1[t2*m1+t1];
		}
	}
}

void mul(double *x1,double *y1,double *result,int n1,int i,int m1)
{
	int t1,t2,t3;
	double s;
	for(t1=0;t1<n1;t1++)
	for(t2=0;t2<m1;t2++)
	{
		s=0;
		for(t3=0;t3<i;t3++)
		{
			s=s+x1[t1*i+t3]*y1[t3*m1+t2];
		}
		result[t1*m1+t2]=s;
	}
}

void swap(double * x,int m,int i,int j) /*swamp two lines in the matrix*/
{
	int t;
	double temp;
	for(t=0;t<m;t++)
	{
		temp=x[i*m+t];
		x[i*m+t]=x[j*m+t];
		x[j*m+t]=temp;
	}
}

void div1(double *x,int m,int i,int j)
{
	int t;
	double a;
	a=x[i*m+j];
	for(t=0;t<m;t++)
		x[i*m+t]=x[i*m+t]/a;
}

void div(double *x,int m,int m1,int i,int j)
{
	 double a;
	 int t;
	 a=-*(x+j*m+m1)/(*(x+i*m+m1));
	 for(t=0;t<m;t++)
		x[j*m+t]=x[j*m+t]+x[i*m+t]*a;
}

// 求逆矩阵
BOOL inv(double *x,double *y,int n)
{
	int i,j;
	double *temp;
	int line;
	temp=new double[n*n*2];
	
	// 将原始矩阵和单位矩阵放在一起
	for(i=0;i<n;i++) /*y=E*/
	{
		for(j=0;j<n;j++)
			temp[2*i*n+j]=x[i*n+j];
		for(j=n;j<2*n;j++)
		{
			if(j-n==i)
				temp[2*n*i+j]=1;
			else
				temp[2*i*n+j]=0;
		}
	}

	// 使下三角矩阵为0
	for(i=0;i<n;i++)
	{
		line=i+1;
		while(fabs(*(temp+i*n*2+i)-0)<EPS)
		{
			if(line==n)
				return FALSE;
			swap(temp,2*n,i,line);
			line++;
		}
		for(j=line;j<n;j++)
			div(temp,2*n,i,i,j);
	}

	// 判断是否可逆
	if(fabs(*(temp+(n-1)*2*n+n-1)-0)<EPS)
		return FALSE;//Fail

	// 使上三角矩阵为0
	for(i=n-1;i>0;i--)
	{
		for(j=i-1;j>=0;j--)
			div(temp,2*n,i,i,j);
	}

	// 使对角线元素为1
	for(i=0;i<n;i++)
		div1(temp,2*n,i,i);
	
	// 转存结果
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			*(y+i*n+j)=*(temp+i*2*n+j+n);
	
	delete temp;
	return TRUE;
 }

double Row_Col_V(double *x,int n)
{
 double *r1=new double[n*n];
 int line;
 double s=1.0;
 assign(x,r1,n,n);
 for(int i=0;i<n;i++)
  {
	line=i+1;
	while(fabs(*(r1+i*n+i)-0)<EPS)
	 {
	 swap(r1,n,i,line);
	 line++;
	 if(line==n)
	  return 0.0;
	 }
	for(int j=line;j<n;j++)
	 div(r1,n,i,i,j);
  }
  for(i=0;i<n;i++)
	s*=r1[i*n+i];
  return s;
}

void yakbi1(double *x,double *x1,int i,int j,double thita,int n)
{
 int m;
 assign(x,x1,n,n);

 *(x1+i*n+i)=*(x+i*n+i)*sqr(cos(thita))+
		*(x+j*n+j)*sqr(sin(thita))+2*(*(x+i*n+j))*sin(thita)*cos(thita);
 *(x1+j*n+j)=*(x+i*n+i)*sqr(sin(thita))+
		*(x+j*n+j)*sqr(cos(thita))-2*(*(x+i*n+j))*sin(thita)*cos(thita);

 *(x1+i*n+j)=0;
 *(x1+j*n+i)=0;
 for(m=0;m<n;m++)
	  if(m!=i&&m!=j)
	 {
	  *(x1+i*n+m)=*(x+i*n+m)*cos(thita)+*(x+j*n+m)*sin(thita);
	  *(x1+i+m*n)=*(x1+i*n+m);
	  }
 for(m=0;m<n;m++)
	  if(m!=j&&m!=i)
	 {
	  *(x1+j*n+m)=-*(x+i*n+m)*sin(thita)+*(x+j*n+m)*cos(thita);
	  *(x1+j+m*n)=*(x1+j*n+m);
	 }
}

void Yakbi(double *CoMatrix,double *FMatrix,double *Lamda,int n)
{
 double max;
 double thita;
 double *r1,*r2,*t1,*t2,*t3;
 int time=1;
 int row_num;
 int col_num;
 r1=new double[n*n];
 r2=new double[n*n];
 t1=new double[n*n];
 t2=new double[n*n];
 t3=new double[n*n];
 assign(CoMatrix,r1,n,n);
 while(1)
 {
  max=*(r1+1);
  row_num=0;
  col_num=1;
  /*find the max number of the matrix*/
  for(int i=0;i<n;i++)
	for(int j=0;j<n;j++)
	if(fabs(*(r1+i*n+j))>max&&i!=j)
	  {
		max=fabs(*(r1+i*n+j));
		row_num=i;
		col_num=j;
	  }
  if(max<EPS)
	 break;
  if(fabs(*(r1+row_num*(n+1))-*(r1+col_num*(n+1)))<EPS)
	 thita=PI/4;
  else
	 thita=atan(2*(*(r1+row_num*n+col_num))/
		 (*(r1+row_num*(n+1))-*(r1+col_num*(n+1))))/2;
  for(i=0;i<n;i++)
	for(int j=0;j<n;j++)
  {
	if(i==j)
	 *(t2+i*n+j)=1;
	else
	 *(t2+i*n+j)=0;
	}
  *(t2+row_num*(n+1))=cos(thita);
  *(t2+col_num*(n+1))=cos(thita);
  *(t2+row_num*n+col_num)=-sin(thita);
  *(t2+col_num*n+row_num)=sin(thita);

  if(time==1)
	assign(t2,t1,n,n);
  else
	{
	mul(t1,t2,t3,n,n,n);
	assign(t3,t1,n,n);
  }
  yakbi1(r1,r2,row_num,col_num,thita,n);
  assign(r2,r1,n,n);
  time++;
 }
 assign(t1,FMatrix,n,n);

 for(int i=0;i<n;i++)
  *(Lamda+i)=*(r1+i*(n+1));
 delete r1;
 delete r2;
 delete t1;
 delete t2;
 delete t3;
}

// 降序排序
void sortd(double *x,int n,int *m)
{
	int i,j,tmp;
	double temp;
	for(i=0;i<n;i++)
		*(m+i)=i;
	for(i=0;i<n;i++)
		for(j=i;j<n;j++)
			if(*(x+j)>*(x+i))
			{
				 temp=*(x+j);
				 *(x+j)=*(x+i);
				 *(x+i)=temp;
				 tmp=*(m+j);
				 *(m+j)=*(m+i);
				 *(m+i)=tmp;
			}
}

// 升序排序(冒泡)
void sortA(double *x,int n,int *m)
{
	int i,j,tmp;
	double temp;
	for(i=0;i<n;i++)
		*(m+i)=i;
	for(i=0;i<n;i++)
		for(j=i;j<n;j++)
			if(*(x+j)>*(x+i))
			{
				 temp=*(x+j);
				 *(x+j)=*(x+i);
				 *(x+i)=temp;
				 tmp=*(m+j);
				 *(m+j)=*(m+i);
				 *(m+i)=tmp;
			}
}

double new_pow(double x,double y,int i,int j)
{
 double s=1;
 int n;
 for(n=0;n<i;n++)
  s*=x;
 for(n=0;n<j;n++)
  s*=y;
 return s;
}
void qjqn(double *x1,double *x2,int n,int k)
{
 int t1,t2;
 for(t1=0;t1<n;t1++)
  for(t2=0;t2<n;t2++)
  {
	if(t1!=k&&t2!=k)
	 *(x2+t1*n+t2)=*(x1+t1*n+t2)-(*(x1+t1*n+k))*(*(x1+k*n+t2))/(*(x1+k*n+k));
	else if(t1!=k&&t2==k)
	 *(x2+t1*n+t2)=-(*(x1+t1*n+t2))/(*(x1+k*n+k));
	else if(t2!=k&&t1==k)
		 *(x2+t1*n+t2)=(*(x1+t1*n+t2))/(*(x1+k*n+k));
			else
			 *(x2+t1*n+t2)=1/(*(x1+t1*n+t2));
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -