annotate src/samer/maths/Mathx.java @ 8:5e3cbbf173aa tip

Reorganise some more
author samer
date Fri, 05 Apr 2019 22:41:58 +0100
parents bf79fb79ee13
children
rev   line source
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