高斯变换,在C语言中实现的思路,知道的请告诉我,详细点越好

高斯变换,在C语言中实现的思路,知道的请告诉我,详细点越好,第1张

#include <stdio.h>

#include <iostream.h>

#include <math.h>

#include<iomanip.h>

class Angle

{

public:

double degree,cent,second,Hudu,seconds

//

构造函数

Angle(double _degree,double _cent,double _second)

{

degree=_degree

cent=_cent

second=_second

seconds=(degree*3600+cent*60+second)

Hudu=(degree*3600+cent*60+second)*2*3.1415926535/(360*60*60)

}

Angle()

{

}

SToD()

{

second=seconds-int(seconds/60)*60

degree=int((seconds-second)/3600)

cent=int((seconds-second-degree*3600)/60)

}

~Angle()

{

}

}

void main()

{

//

正算过程

//

定义变量

Angle B(51,38,43.9023),L(126,2,13.1360),_B,_L

double L0,l,N,a0,a4,a6,a3,a5,x,y,rou

rou=(360*60*60)/(2*3.1415926535)

if(int(L.degree)%6!=0)

{

L0=6*(int(L.degree)/6+1)-3+6

}

else

L0=6*(int(L.degree)/6)-3+6

l=L.Hudu-L0*3600*2*3.1415926535/(360*60*60)

N=6399698.902-(21562.267-(108.973-0.612*cos(B.Hudu)*cos(B.Hudu))*cos(B.Hudu)*cos(

B.Hudu))*cos(B.Hudu)*cos(B.Hudu)

a0=32140.404-(135.3302-(0.7092-0.0040*cos(B.Hudu)*cos(B.Hudu))*cos(B.Hudu)*cos(B.

Hudu))*cos(B.Hudu)*cos(B.Hudu)

a4=(0.25+0.00252*cos(B.Hudu)*cos(B.Hudu))*cos(B.Hudu)*cos(B.Hudu)-0.04166

a6=(0.166*cos(B.Hudu)*cos(B.Hudu)-0.084)*cos(B.Hudu)*cos(B.Hudu)

a3=(0.3333333+0.001123*cos(B.Hudu)*cos(B.Hudu))*cos(B.Hudu)*cos(B.Hudu)-0.166666

7

a5=0.0083-(0.1667-(0.1968+0.0040*cos(B.Hudu)*cos(B.Hudu))*cos(B.Hudu)*cos(B.Hudu)

)*cos(B.Hudu)*cos(B.Hudu)

x=6367558.4969*B.Hudu-(a0-(0.5+(a4+a6*l*l)*l*l)*l*l*N)*sin(B.Hudu)*cos(B.Hudu)

y=(1+(a3+a5*l*l)*l*l)*l*N*cos(B.Hudu)

//结果输出

cout<银纯猛<"x="<<x<<endl

cout<锋桥<"y="<裤哪<y<<endl

// 反算过程

double b,Bf,Nf,Z,b2,b3,b4,b5,l1

b=(x/6367558.4969)

Bf=b+(50221746+(293622+(2350+22*cos(b)*cos(b))*cos(b)*cos(b))*cos(b)*cos(b))*0.000

0000001*sin(b)*cos(b)

Nf=6399698.902-(21562.267-(108.973-0.612*cos(Bf)*cos(Bf))*cos(Bf)*cos(Bf))*cos(Bf)*c

os(Bf)

Z=y/(Nf*cos(Bf))

b2=(0.5+0.003369*cos(Bf)*cos(Bf))*sin(Bf)*cos(Bf)

b3=0.333333-(0.166667-0.001123*cos(Bf)*cos(Bf))*cos(Bf)*cos(Bf)

b4=0.25+(0.16161+0.00562*cos(Bf)*cos(Bf))*cos(Bf)*cos(Bf)

b5=0.2-(0.1667-0.0088*cos(Bf)*cos(Bf))*cos(Bf)*cos(Bf)

_B.seconds=Bf*rou-(1-(b4-0.12*Z*Z)*Z*Z)*Z*Z*b2*rou

l1=(1-(b3-b5*Z*Z)*Z*Z)*Z*rou

_L.seconds=L0*3600+l1

_B.SToD()

_L.SToD()

卷积在工程和数学上都有很多应用:

统计学中,加权的滑动平均是一种卷积。概率论中,两个统计独立变量X与Y的和的概率密度函数是X与Y的概率密度函数的卷积。声学中,回声可以用源声与一个反映各种反射效应的函数的卷积表示。电子工程与信号处理中,任一个线性系统的输出都可以通过将输入信号与系统函数(系统的冲激响应)做卷积获得。物理学中,任何一个线性系统(符合叠加原理)都存在卷积。

介绍一个实际的概率学应用例子。假设需求到位时间的到达率为poisson(λ)分布,需求的大小的分布函数为D(.),则单位时间的需求量的分布函数为 F(x):

其中 D(k)(x)为k阶卷积。

卷积是一种线性运算,图像处理中常见的mask运算都是卷积,广泛应用于图谈没像滤波。castlman的书对卷积讲得很详细。

高斯变换就是用高斯函数对图像进行卷积。高斯算子可以直接从离散高斯函数得到含唯纳:

for(i=0i<Ni++)

{

for(j=0j<Nj++)

{

g[i*N+j]=exp(-((i-(N-1)/2)^2+(j-(N-1)/2)^2))/(2*delta^2))

sum += g[i*N+j]

}

}

再除以 sum 得到归一化算子

N是滤波器的大小,delta自选

首先,在提到卷积之前,必须提到卷积出现的背景。卷积是在信号与线性系统的基础上或背景中出现的,脱离这个背景单独谈卷积是没有任何意义的,除了那个所谓褶反公式上的数学意义和积分(或求和,离散情况下)。

信号与线性系统,讨论的就是信号经过一个线性系统以后发生的变化(就是输入 输出 和所经过的所谓系统,这三者之间的数学关系)。所谓线性系统的含义,就是,这个所谓的系统,带来的输出信号与输入信号的数学关系式之间是线性的运算关系。

因此,实际上,都是要根据我们需要待处理的信号形式,来设计所谓的系统传递函数,那么这个系统的传递函数和输入信号,在数学上的形式就是所谓的卷积关系。

卷积关系最重要的一种情况,就是在信号与线性系统或数字信号处理中的卷积定理。利用该定理,可以将时间域或空间域中的卷积运算等价为频率域的相乘运山大算,从而利用FFT等快速算法,实现有效的计算,节省运算代价。

C++语言代码: void convolution(float *input1, float *input2, float *output, int mm, int nn){ float *xx = new float[mm+nn-1]// do convolution for (int i = 0i <mm+nn-1i++){ xx[i] = 0.0 for (int j = 0j <mmj++) { if (i-j >0 &&i-j <nn)xx[i] += input1[j] * input2[i-j]} } // set value to the output array for (int i = 0i <mmi++) output[i] = xx[i + (nn-1) / 2]delete[] xx}

由于转向带模拟法是将确定在若干直线上的很大数目的独立的现实相加,因此根据中心极限定理,这个方法得形成具有多维正态分布的随机函数ZS(x)的三维现实ZS(x),因此在平稳假设下,当x固定时ZS(x)是正态分布的,且与x无关,因此,模拟值{ZS(x)x∈矿床}的直方图也将是正态分布的,因为模拟值的直方图是当x固定时ZS(x)的分布律的一个估计。

但在实践中,观测数据{Z0(xα)α∈I}的直方图在大部分情况下是非正态分布的,特别是矿床内的品位值,而具有正态分布的模拟{ZS(x)x∈矿床}却可以有相当部分的负值。因此,就必须设法使模拟值ZS(x)的直方图和有效实验数据的直方图一致,这就需要将非正态分布化为正态分布。

令Z0(x)为一平稳区域化变量,它具有一个为实测有效数据{Z0(xα)α∈I}的实验直方图所代表的分布,利用正态变形函数φ可将标准正态变量u(x)变为Z0(x),即Z0=φ(u)或u=φ-1(Z0),现在我们不直接模拟Z0(x),而先模拟经过逆正态变形后的u(x),利用转向带法所得到这个模拟{su(x)x∈矿床},也将有一个正态分布直方图,再经过正态变形φ,即可得到所要模拟的{ZS(x)x∈矿床},其中ZS(x)=φ[us(x)]具有与实测数据相同的直方图,模拟过程中的协方差函数或变差函数必须是经过变换后的具有标准正态分布的数据u(xα),α=1,2,…,n推算出来的,这样处理尽管不严格,但实践上变换回来的模拟值SZ(x)将具有所指定的协方差C(r),因此,模拟ZS(x)不仅再现一、二阶矩,而且还可以再现一元山枝弯分布。

一般情况下,正态变换都是通过将实测数据Z(xα)的累积频率曲线与Y(x)的标准正态分布函数之间用图形对应法对应起来,即若用G(y)表示标准正态分布的累积分布频率搭兆,F(z)表示实测数据的累积分布频率,那么对任意一个Z值总能找到一个对应的Y值,使得F(z)=G(y),这样对每个z都可以找到一个对应的y,即变量Z与变量Y之间具有一一对应的映射关系(如下图),这就完成了高斯转换。

然而,在许多情况下,实测数据Z(xα)的值均发生俭聚现象,即实测数据Z(xα)中相当大的一部分数据具有相同的观测值。假如所研究的样品中有50%的品位值为0,那么,这些品位值为0的样品对应于高斯变量中就有50%的高斯等价量为负,这样就存在一个问题:高斯等价量中的负值如何与原始样品中的0值形成一一映射关系?而只能随机地将它们对应起来,由此而产生的模拟结果也只能随机地与品位值发生映射关系。这种随机性往往使模拟结果偏离实际情况。因而,在这种情况下,利用直观的图解转换法进行转换就会失去转换的真实性。埃尔米特模型不失为一种有效的办法,而且,其转换后的数据不仅再现了一、二阶矩,而且,服从二元正态分布。

随机变量Z(x)与 高斯变量Y(x)转换 对应关系

埃米尔特模型可以简单地表示为

地质统计学(空间信息统计学)基本理论与方法应用

式中:φi为埃米尔特系数Hi(y)为埃米尔特多项式n为埃米尔特多项式的项数,且n≥0。Hi(y)是一个具有与正态分布密切相关的特殊性质的多项式,可表示为

地质统计学(空间信息统计学)基本理论与方法应用

地质统计学(空间信息统计学)基本理论与方法应用

Hn(y)具有如下特殊性质:

1)H0(y)=1

2)H1(y)=-y

3)H2(y)

4)其他各项多项式可根据如下的递推关系求得:

地质统计学(空间信息统计学)基本理论与方法应用

地质统计学(空间信息统计学)基本理论与方法应用

以后的问题就是如何求埃尔米特多项式的系数φi,下面直接给出其计算公逗闷式:

φ0=E{φ[Y(x)]}=E[Z(x)]=m

地质统计学(空间信息统计学)基本理论与方法应用

式中:g(y0)=0,g(yi+1)=0

据此,可以将原始品位数据转换成标准高斯变量,然后对高斯变量进行模拟。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12405324.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存