File: function.c

package info (click to toggle)
grass 6.0.2-6
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 40,044 kB
  • ctags: 31,303
  • sloc: ansic: 321,125; tcl: 25,676; sh: 11,176; cpp: 10,098; makefile: 5,025; fortran: 1,846; yacc: 493; lex: 462; perl: 133; sed: 1
file content (95 lines) | stat: -rw-r--r-- 1,599 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <math.h>
#include "gis.h"
#include "Vect.h"
#include "global.h"

/*
  probability for gaussian distribution 
*/
double gaussian2dBySigma(double d, double sigma)
{
  double res;
  res=1./(2.*M_PI*sigma*sigma)*exp(-d*d/(2.*sigma*sigma));
  return(res);
}

double gaussianFunction(double x, double sigma, double dimension)
{
  return((1./(pow(2.*M_PI,dimension/2.)*pow(sigma,dimension)))*exp(-0.5*pow(x/sigma,2.)));
}

/*
  probability for gaussian distribution 
*/
double gaussianKernel(double x, double term)
{
  return(term * exp(-(x*x)/2.));
}


double gaussian2dByTerms(d,term1,term2)
     /*
       term1=1./(2.*M_PI*sigma*sigma)
       term2=2.*sigma*sigma;
     */
     double d, term1, term2;
{
  double res;
  res=term1*exp(-d*d/term2);
  return(res);
}


double segno(double x){
  double y; 
  y = (x > 0 ? 1. : 0.) + (x < 0 ? -1. : 0.);
  return y;
}


double kernel1(d,rs,lambda)
     /*
     */
     double d, rs, lambda;
{
  double res,a;
  a=lambda-1.;
  if(lambda==1.){
    res=1./(M_PI*(d*d+rs*rs));
  }else{
    res=segno(a)*(a/M_PI)*(pow(rs,2.*a))*(1/pow(d*d+rs*rs,lambda));
  }
    /*  res=1./(M_PI*(d*d+rs*rs));*/
  return(res);
}

double invGaussian2d(sigma,prob)
     double sigma, prob;
{
  double d;
  d = sqrt(-2*sigma*sigma*log(prob*M_PI*2*sigma*sigma));
  return(d);
}     

double euclidean_distance(x,y,n)
     /*
       euclidean distance between vectors x and y of length n
     */
     double *x, *y;
     int n;
{
  int j;
  double out = 0.0;
  double tmp;
  

  for(j=0;j<n;j++){
    tmp = x[j] - y[j];
    out += tmp * tmp;
  }
  

  return sqrt(out);
}