samer@0
|
1 /*
|
samer@0
|
2 * Mathx.java
|
samer@0
|
3 *
|
samer@0
|
4 * Copyright (c) 2000, Samer Abdallah, King's College London.
|
samer@0
|
5 * All rights reserved.
|
samer@0
|
6 *
|
samer@0
|
7 * This software is provided AS iS and WITHOUT ANY WARRANTY;
|
samer@0
|
8 * without even the implied warranty of MERCHANTABILITY or
|
samer@0
|
9 * FITNESS FOR A PARTICULAR PURPOSE.
|
samer@0
|
10 */
|
samer@0
|
11
|
samer@0
|
12 package samer.maths;
|
samer@0
|
13
|
samer@0
|
14 /**
|
samer@0
|
15 A Class full of static functions, mainly for manipulating
|
samer@0
|
16 double arrays.
|
samer@0
|
17 */
|
samer@0
|
18
|
samer@0
|
19 public class Mathx
|
samer@0
|
20 {
|
samer@0
|
21 private static double [] zeros = null;
|
samer@0
|
22 private static int zlength = 0;
|
samer@0
|
23
|
samer@0
|
24 public double [] doubleArray(int n) { return new double[n]; }
|
samer@0
|
25
|
samer@0
|
26 /** set to zeros */
|
samer@0
|
27 public static void zero(double [] x)
|
samer@0
|
28 {
|
samer@0
|
29 if (zlength<x.length) {
|
samer@0
|
30 zlength = x.length;
|
samer@0
|
31 zeros = new double[zlength];
|
samer@0
|
32 for (int i=0; i<zlength; i++) zeros[i]=0;
|
samer@0
|
33 }
|
samer@0
|
34 System.arraycopy(zeros,0,x,0,x.length);
|
samer@0
|
35 }
|
samer@0
|
36
|
samer@0
|
37 /** set all to given value */
|
samer@0
|
38 public static void setAll(double [] x, double a) {
|
samer@0
|
39 for (int i=0; i<x.length; i++) x[i]=a;
|
samer@0
|
40 }
|
samer@0
|
41
|
samer@0
|
42 /** log in place */
|
samer@0
|
43 public static void log(double [] x) {
|
samer@0
|
44 for (int i=0; i<x.length; i++) x[i]=Math.log(x[i]);
|
samer@0
|
45 }
|
samer@0
|
46
|
samer@0
|
47 /** negate in place */
|
samer@0
|
48 public static void negate(double [] x) {
|
samer@0
|
49 for (int i=0; i<x.length; i++) x[i]=-x[i];
|
samer@0
|
50 }
|
samer@0
|
51
|
samer@0
|
52 /** negate to y: x[i]=y[i] for all i */
|
samer@0
|
53 public static void negate(double [] x, double [] y) {
|
samer@0
|
54 for (int i=0; i<x.length; i++) y[i]=-x[i];
|
samer@0
|
55 }
|
samer@0
|
56
|
samer@0
|
57 /** subtract: x[i]=y[i]-z[i] for all i */
|
samer@0
|
58 public static void sub(double [] x, double [] y, double [] z) {
|
samer@0
|
59 for (int i=0; i<x.length; i++) x[i]=y[i]-z[i];
|
samer@0
|
60 }
|
samer@0
|
61
|
samer@0
|
62 public static void sub(int n, double [] x, double [] y, double [] z) {
|
samer@0
|
63 for (int i=0; i<n; i++) x[i]=y[i]-z[i];
|
samer@0
|
64 }
|
samer@0
|
65
|
samer@0
|
66 /** subtract in place y: x[i]-=y[i] for all i */
|
samer@0
|
67 public static void sub(double [] x, double [] y) {
|
samer@0
|
68 for (int i=0; i<x.length; i++) x[i]-=y[i];
|
samer@0
|
69 }
|
samer@0
|
70
|
samer@0
|
71 public static void sub(int n, double [] x, double [] y) {
|
samer@0
|
72 for (int i=0; i<n; i++) x[i]-=y[i];
|
samer@0
|
73 }
|
samer@0
|
74
|
samer@0
|
75
|
samer@0
|
76 /** subtract scalar in place y: x[i]-=y for all i */
|
samer@0
|
77 public static void sub(double [] x, double y) {
|
samer@0
|
78 for (int i=0; i<x.length; i++) x[i]-=y;
|
samer@0
|
79 }
|
samer@0
|
80
|
samer@0
|
81 /** add two arrays: x[i]=y[i]+z[i] for all i */
|
samer@0
|
82 public static void add(double [] x, double [] y, double [] z) {
|
samer@0
|
83 for (int i=0; i<x.length; i++) x[i]=y[i]+z[i];
|
samer@0
|
84 }
|
samer@0
|
85
|
samer@0
|
86 /** add in place y: x[i]+=y[i] for all i */
|
samer@0
|
87 public static void add(double [] x, double [] y) {
|
samer@0
|
88 for (int i=0; i<x.length; i++) x[i]+=y[i];
|
samer@0
|
89 }
|
samer@0
|
90
|
samer@0
|
91 public static void add(int n, double [] x, double [] y) {
|
samer@0
|
92 for (int i=0; i<n; i++) x[i]+=y[i];
|
samer@0
|
93 }
|
samer@0
|
94
|
samer@0
|
95 /** add scalar in place y: x[i]+=y for all i */
|
samer@0
|
96 public static void add(double [] x, double y) {
|
samer@0
|
97 for (int i=0; i<x.length; i++) x[i]+=y;
|
samer@0
|
98 }
|
samer@0
|
99
|
samer@0
|
100 /** return sum of elements in x */
|
samer@0
|
101 public static double sum(double [] x)
|
samer@0
|
102 {
|
samer@0
|
103 double total=0;
|
samer@0
|
104 for (int i=0; i<x.length; i++) total+=x[i];
|
samer@0
|
105 return total;
|
samer@0
|
106 }
|
samer@0
|
107
|
samer@0
|
108 public static void muladd(int n, double [] x, double [] y, double k) {
|
samer@0
|
109 for (int i=0; i<n; i++) x[i]+=k*y[i];
|
samer@0
|
110 }
|
samer@0
|
111
|
samer@0
|
112 /** return product of elements in x */
|
samer@0
|
113 public static double prod(double [] x)
|
samer@0
|
114 {
|
samer@0
|
115 double total=1;
|
samer@0
|
116 for (int i=0; i<x.length; i++) total*=x[i];
|
samer@0
|
117 return total;
|
samer@0
|
118 }
|
samer@0
|
119
|
samer@0
|
120 /** multiply by scalar in place: x[i] *=k */
|
samer@0
|
121 public static void mul(double [] x, double k) {
|
samer@0
|
122 for (int i=0; i<x.length; i++) x[i]*=k;
|
samer@0
|
123 }
|
samer@0
|
124
|
samer@0
|
125 public static void mul(int n, double [] x, double k) {
|
samer@0
|
126 for (int i=0; i<n; i++) x[i]*=k;
|
samer@0
|
127 }
|
samer@0
|
128
|
samer@0
|
129 /** scalar multiply x[i] = k*y[i] */
|
samer@0
|
130 public static void mul(double [] x, double [] y, double k) {
|
samer@0
|
131 for (int i=0; i<x.length; i++) x[i]=k*y[i];
|
samer@0
|
132 }
|
samer@0
|
133
|
samer@0
|
134 /** elementwise multiply in place: x[i] *=y[i] */
|
samer@0
|
135 public static void mul(double [] x, double [] y) {
|
samer@0
|
136 for (int i=0; i<x.length; i++) x[i]*=y[i];
|
samer@0
|
137 }
|
samer@0
|
138
|
samer@0
|
139 /** elementwise multiply x[i] =y[i]*z[i] */
|
samer@0
|
140 public static void mul(double [] x, double [] y, double [] z) {
|
samer@0
|
141 for (int i=0; i<x.length; i++) x[i]=y[i]*z[i];
|
samer@0
|
142 }
|
samer@0
|
143
|
samer@0
|
144 /** elementwise divide in place: x[i] /=y[i] */
|
samer@0
|
145 public static void div(double [] x, double [] y) {
|
samer@0
|
146 for (int i=0; i<x.length; i++) x[i]/=y[i];
|
samer@0
|
147 }
|
samer@0
|
148
|
samer@0
|
149 /** elementwise divide: x[i]=y[i]/z[i] */
|
samer@0
|
150 public static void div(double [] x, double [] y, double [] z) {
|
samer@0
|
151 for (int i=0; i<x.length; i++) x[i]=y[i]/z[i];
|
samer@0
|
152 }
|
samer@0
|
153
|
samer@0
|
154 /** return maximum element of x */
|
samer@0
|
155 public static double max(double [] x)
|
samer@0
|
156 {
|
samer@0
|
157 double xmax=x[0];
|
samer@0
|
158 for (int i=1; i<x.length; i++) if (x[i]>xmax) xmax=x[i];
|
samer@0
|
159 return xmax;
|
samer@0
|
160 }
|
samer@0
|
161
|
samer@0
|
162 /** return minimum element of x */
|
samer@0
|
163 public static double min(double [] x)
|
samer@0
|
164 {
|
samer@0
|
165 double xmin=x[0];
|
samer@0
|
166 for (int i=1; i<x.length; i++) if (x[i]<xmin) xmin=x[i];
|
samer@0
|
167 return xmin;
|
samer@0
|
168 }
|
samer@0
|
169
|
samer@0
|
170 /** return index of supremum of elements in x */
|
samer@0
|
171 public static int argmax(double [] x)
|
samer@0
|
172 {
|
samer@0
|
173 double xmax=x[0];
|
samer@0
|
174 int imax=0;
|
samer@0
|
175 for (int i=1; i<x.length; i++) {
|
samer@0
|
176 if (x[i]>xmax) { xmax=x[i]; imax=i; }
|
samer@0
|
177 }
|
samer@0
|
178 return imax;
|
samer@0
|
179 }
|
samer@0
|
180
|
samer@0
|
181 /** return dot product of a and b: sum_i a[i]*b[i] */
|
samer@0
|
182 public static double dot( double [] a, double [] b)
|
samer@0
|
183 {
|
samer@0
|
184 double t=0;
|
samer@0
|
185 for (int i=0; i<a.length; i++) t+=a[i]*b[i];
|
samer@0
|
186 return t;
|
samer@0
|
187 }
|
samer@0
|
188
|
samer@0
|
189 /** return 2-norm of a: sum_i a[i]*a[i] */
|
samer@0
|
190 public static double norm2( double [] a)
|
samer@0
|
191 {
|
samer@0
|
192 double t=0;
|
samer@0
|
193 for (int i=0; i<a.length; i++) t+=a[i]*a[i];
|
samer@0
|
194 return t;
|
samer@0
|
195 }
|
samer@0
|
196
|
samer@0
|
197 public static double norm2( int n, double [] a)
|
samer@0
|
198 {
|
samer@0
|
199 double t=0;
|
samer@0
|
200 for (int i=0; i<n; i++) t+=a[i]*a[i];
|
samer@0
|
201 return t;
|
samer@0
|
202 }
|
samer@0
|
203
|
samer@0
|
204 /** copy a to b: b[i]=a[i] */
|
samer@0
|
205 public static void copy( double [] a, double [] b) {
|
samer@0
|
206 System.arraycopy(a,0,b,0,a.length);
|
samer@0
|
207 }
|
samer@0
|
208
|
samer@0
|
209 /** return copy a in new array */
|
samer@0
|
210 public static double [] copy( double [] a) {
|
samer@0
|
211 double [] b = new double[a.length];
|
samer@0
|
212 System.arraycopy(a,0,b,0,a.length);
|
samer@0
|
213 return b;
|
samer@0
|
214 }
|
samer@0
|
215
|
samer@0
|
216 public static double tanh(double t) {
|
samer@0
|
217 // if (t<-24) return -1;
|
samer@0
|
218 // if (t>24) return 1;
|
samer@0
|
219 if (t<0) { double z=Math.exp(2*t); return (z-1)/(z+1); }
|
samer@0
|
220 else { double z=Math.exp(-2*t); return (1-z)/(1+z); }
|
samer@0
|
221 }
|
samer@0
|
222
|
samer@0
|
223 public static double atanh(double t) { return Math.log((1+t)/(1-t))/2; }
|
samer@0
|
224 public static double cosh(double t) { double z=Math.exp(-t); return (1/z+z)/2; }
|
samer@0
|
225 public static double sinh(double t) { double z=Math.exp(-t); return (1/z-z)/2; }
|
samer@0
|
226
|
samer@0
|
227 /** matrix multiplication: y[i] = sum_j A[i][j] x[j] */
|
samer@0
|
228 public static void mul( double [] y, double [][]A, double [] x)
|
samer@0
|
229 {
|
samer@0
|
230 int n=y.length;
|
samer@0
|
231 int m=x.length;
|
samer@0
|
232 double [] arow;
|
samer@0
|
233
|
samer@0
|
234 for (int i=0; i<n; i++) {
|
samer@0
|
235 double t=0;
|
samer@0
|
236 arow=A[i];
|
samer@0
|
237 for (int j=0; j<m; j++) t+=arow[j]*x[j];
|
samer@0
|
238 y[i]=t;
|
samer@0
|
239 }
|
samer@0
|
240 }
|
samer@0
|
241
|
samer@0
|
242
|
samer@0
|
243 /** set each elements of a by extracting successive values from g */
|
samer@0
|
244 public static void set( double[] a, Generator g) {
|
samer@0
|
245 g.next(a);
|
samer@0
|
246 // int n=a.length; for (int i=0; i<n; i++) a[i]=g.next();
|
samer@0
|
247 }
|
samer@0
|
248
|
samer@0
|
249 /** increment each element of a by a value extracted from g */
|
samer@0
|
250 public void add( double[] a, Generator g) {
|
samer@0
|
251 int n=a.length; for (int i=0; i<n; i++) a[i]+=g.next();
|
samer@0
|
252 }
|
samer@0
|
253
|
samer@0
|
254 /** set each element using a function of its index */
|
samer@0
|
255 public static void index( double[] a) {
|
samer@0
|
256 for (int i=0; i<a.length; i++) a[i]=(double)i;
|
samer@0
|
257 }
|
samer@0
|
258
|
samer@0
|
259 public static void indexFr( double[] a) {
|
samer@0
|
260 int N=a.length; for (int i=0; i<N; i++) a[i]=(double)i/N;
|
samer@0
|
261 }
|
samer@0
|
262
|
samer@0
|
263 /** set each element using a function of its index */
|
samer@0
|
264 public static void table( double[] a, Function f) {
|
samer@0
|
265 index(a); f.apply(a);
|
samer@0
|
266 }
|
samer@0
|
267 }
|
samer@0
|
268
|
samer@0
|
269
|