/** * */ package fr.unistra.pelican.util; import java.util.Arrays; /** * Some math operations for double []. * <br> By default operations are done in place (the argument is modified). * <br> Function ending by F (Functional) do not modify their argument. * * @author Benjamin Perret * */ public final class VMath { /** * Never instantiate this class */ private VMath(){ } /** * Create new double array of given size initialized to given value * @param size * @param value * @return */ public static double [] newVector(int size, double value) { double [] res=new double [size]; Arrays.fill(res, value); return res; } /** * Absolute value * @param a * @return */ public static final double [] abs(double [] a) { for(int i=0;i<a.length;i++) a[i]=Math.abs(a[i]); return a; } /** * Absolute value, new vector allocated * @param a * @return */ public static final double [] absF(double [] a) { double [] res=a.clone(); for(int i=0;i<a.length;i++) res[i]=Math.abs(a[i]); return res; } /** * Sum element by element (no length check!) * @param a * @param b * @return */ public static final double [] add(double [] a, double [] b) { for(int i=0;i<a.length;i++) a[i]+=b[i]; return a; } /** * Sum element by element (no length check!), new vector allocated * @param a * @param b * @return */ public static final double [] addF(double [] a, double [] b) { double [] res=a.clone(); for(int i=0;i<a.length;i++) res[i]+=b[i]; return res; } /** * Subtraction element by element (no length check!) * @param a * @param b * @return */ public static final double [] sub(double [] a, double [] b) { for(int i=0;i<a.length;i++) a[i]-=b[i]; return a; } /** * Subtraction element by element (no length check!), new vector allocated * @param a * @param b * @return */ public static final double [] subF(double [] a, double [] b) { double [] res=a.clone(); for(int i=0;i<a.length;i++) res[i]-=b[i]; return res; } /** * Divide all elements by the same number * @param a * @param k * @return */ public static final double [] div(double [] a, double k) { for(int i=0;i<a.length;i++) a[i]/=k; return a; } /** * Division element by element (no length check!) * @param a * @param b * @return */ public static final double [] div(double [] a, double [] b) { for(int i=0;i<a.length;i++) a[i]/=b[i]; return a; } /** * Division element by element (no length check!), new vector allocated * @param a * @param b * @return */ public static final double [] divF(double [] a, double [] b) { double [] res=a.clone(); for(int i=0;i<a.length;i++) res[i]/=b[i]; return res; } /** * Multiplication element by element (no length check!) * @param a * @param b * @return */ public static final double [] mul(double [] a, double [] b) { for(int i=0;i<a.length;i++) a[i]*=b[i]; return a; } /** * Multiplication element by element (no length check!), new vector allocated * @param a * @param b * @return */ public static final double [] mulF(double [] a, double [] b) { double [] res=a.clone(); for(int i=0;i<a.length;i++) res[i]*=b[i]; return res; } /** * Multiplication by a scalar * @param a * @param b * @return */ public static final double [] mul(double [] a, double k) { for(int i=0;i<a.length;i++) a[i]*=k; return a; } /** * Multiplication by a scalar, new vector allocated * @param a * @param b * @return */ public static final double [] mulF(double [] a, double k) { double [] res=a.clone(); for(int i=0;i<a.length;i++) res[i]*=k; return res; } /** * Compute Euclidean norm * @param a * @return */ public static final double norm(double [] a) { double res=0.0; for(int i=0;i<a.length;i++) res+=a[i]*a[i]; return Math.sqrt(res); } /** * Compute dot product of an element by itself * @param a * @param b * @return */ public static final double dotProduct(double [] a) { double res=0.0; for(int i=0;i<a.length;i++) res+=a[i]*a[i]; return res; } /** * Compute dot product (no length check!) * @param a * @param b * @return */ public static final double dotProduct(double [] a,double [] b) { double res=0.0; for(int i=0;i<a.length;i++) res+=a[i]*b[i]; return res; } /** * Compute Euclidean distance (no length check!) * @param a * @param b * @return */ public static final double dist(double [] a, double [] b) { double res=0.0; for(int i=0;i<a.length;i++) { double v=a[i]-b[i]; res+=v*v; } return Math.sqrt(res); } /** * Compute sum of elements * @param a * @return */ public static final double sum(double [] a) { double res=0.0; for(int i=0;i<a.length;i++) res+=a[i]; return res; } }