-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathaddvector_to_CF.c
84 lines (67 loc) · 2.33 KB
/
addvector_to_CF.c
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
#include "CommandLineInterface/CLIcore.h"
#include "clustering_defs.h"
errno_t addvector_to_CF(CLUSTERTREE *ctree,
double *datavec,
long double ssqr,
long N,
long CFindex,
int *addOK)
{
DEBUG_TRACE_FSTART();
double *sumvec = (double *) malloc(sizeof(double) * ctree->npix);
long N1 = ctree->CFarray[CFindex].N + N;
double sum2 = 0.0;
// add to vec sum
for(long ii = 0; ii < ctree->npix; ii++)
{
sumvec[ii] = ctree->CFarray[CFindex].datasumvec[ii] + datavec[ii];
sum2 += sumvec[ii] * sumvec[ii];
}
long double ssq1 = ctree->CFarray[CFindex].datassq + ssqr;
// compute cluster radius
long double tmpv1 = ssq1 / N1;
long double tmpv2 = sum2 / (N1 * N1);
double radius2 = tmpv1 - tmpv2;
if((radius2 < ctree->T * ctree->T) || (*addOK == 1))
{
*addOK = 1;
for(long ii = 0; ii < ctree->npix; ii++)
{
ctree->CFarray[CFindex].datasumvec[ii] = sumvec[ii];
}
free(sumvec);
ctree->CFarray[CFindex].N = N1;
ctree->CFarray[CFindex].datassq = ssq1;
ctree->CFarray[CFindex].sum2 = sum2;
ctree->CFarray[CFindex].radius2 = radius2;
}
else
{
*addOK = 0;
}
DEBUG_TRACE_FEXIT();
return RETURN_SUCCESS;
}
errno_t subvector_to_CF(
CLUSTERTREE *ctree, double *datavec, long double ssqr, long N, long CFindex)
{
DEBUG_TRACE_FSTART();
ctree->CFarray[CFindex].N -= N;
// sub to vec sum
ctree->CFarray[CFindex].sum2 = 0.0;
for(long ii = 0; ii < ctree->npix; ii++)
{
ctree->CFarray[CFindex].datasumvec[ii] -= datavec[ii];
ctree->CFarray[CFindex].sum2 += ctree->CFarray[CFindex].datasumvec[ii] *
ctree->CFarray[CFindex].datasumvec[ii];
}
ctree->CFarray[CFindex].datassq -= ssqr;
// compute cluster radius
long double tmpv1 =
ctree->CFarray[CFindex].datassq / ctree->CFarray[CFindex].N;
long double tmpv2 = ctree->CFarray[CFindex].sum2 /
ctree->CFarray[CFindex].N / ctree->CFarray[CFindex].N;
ctree->CFarray[CFindex].radius2 = tmpv1 - tmpv2;
DEBUG_TRACE_FEXIT();
return RETURN_SUCCESS;
}