annotate src/samer/units/Matrices.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 * Copyright (c) 2000, Samer Abdallah, King's College London.
samer@0 3 * All rights reserved.
samer@0 4 *
samer@0 5 * This software is provided AS iS and WITHOUT ANY WARRANTY;
samer@0 6 * without even the implied warranty of MERCHANTABILITY or
samer@0 7 * FITNESS FOR A PARTICULAR PURPOSE.
samer@0 8 */
samer@0 9
samer@0 10 package samer.units;
samer@0 11 import samer.core.*;
samer@0 12 import samer.maths.*;
samer@0 13
samer@0 14 /** Some special matrix factories */
samer@0 15 public class Matrices
samer@0 16 {
samer@0 17 public static void set(Matrix A, Generator G) { A.set(G); A.changed(); }
samer@0 18 public static void add(Matrix A, Generator G) { A.add(G); A.changed(); }
samer@0 19
samer@0 20 public static void fourierBasis(Matrix A)
samer@0 21 {
samer@0 22 int m=A.getColumnDimension();
samer@0 23 int n=A.getRowDimension();
samer@0 24 double [][] a = A.getArray();
samer@0 25
samer@0 26 for (int j=3; j<m;j+=2) {
samer@0 27 double omega=(j-1)*Math.PI/m;
samer@0 28 for (int i=0; i<n; i++) {
samer@0 29 double theta=i*omega;
samer@0 30 a[i][j-2] = Math.cos(theta);
samer@0 31 a[i][j-1] = Math.sin(theta);
samer@0 32 }
samer@0 33 }
samer@0 34 for (int i=0; i<n; i++) {
samer@0 35 a[i][0] = 1;
samer@0 36 a[i][m-1] = (i%2)==0 ? 1 : -1;
samer@0 37 }
samer@0 38 A.changed();
samer@0 39 }
samer@0 40
samer@0 41 public static void pingBasis(Matrix A) {
samer@0 42 pingBasis(A,Shell.getDouble("gamma",0.5));
samer@0 43 }
samer@0 44
samer@0 45 public static void pingBasis(Matrix A, double gamma)
samer@0 46 {
samer@0 47 int extra = (int)(3.0*16.0/gamma);
samer@0 48 int m=A.getColumnDimension();
samer@0 49 int n=A.getRowDimension();
samer@0 50 double [][] a = A.getArray();
samer@0 51
samer@0 52 A.zero();
samer@0 53
samer@0 54 for (int j=0; j<m; j++) {
samer@0 55 int jj=(int)((n+extra)*Math.random())-extra;
samer@0 56 double omega=0.2+2*Math.random();
samer@0 57 double t=0.0;
samer@0 58 for (int i=0; i<n; i++) {
samer@0 59 if (i>=jj) {
samer@0 60 t=i-jj;
samer@0 61 a[i][j]=Math.exp(-gamma*t/16)*Math.sin(omega*t);
samer@0 62 } else a[i][j]=0;
samer@0 63 }
samer@0 64 }
samer@0 65 A.changed();
samer@0 66 }
samer@0 67
samer@0 68 public static void fuzzyIdentity(Matrix matrix) {
samer@0 69 int n = matrix.getRowDimension();
samer@0 70 int m = matrix.getColumnDimension();
samer@0 71 fuzzyIdentity(matrix,Shell.getDouble("sigma",
samer@0 72 (n>m) ? n/(double)m : m/(double)n));
samer@0 73 }
samer@0 74
samer@0 75 public static void fuzzyIdentity(Matrix matrix, double s)
samer@0 76 {
samer@0 77 int n = matrix.getRowDimension();
samer@0 78 int m = matrix.getColumnDimension();
samer@0 79 double t = s/Math.max(n,m);
samer@0 80 double I[][] = matrix.getArray();
samer@0 81
samer@0 82 for (int i=0; i<n; i++) {
samer@0 83 for (int j=0; j<m; j++) {
samer@0 84 double Z = j/(double)(m-1) - i/(double)(n-1);
samer@0 85 I[i][j] = Math.exp(-(Z*Z)/(2*t*t));
samer@0 86 }
samer@0 87 }
samer@0 88
samer@0 89 matrix.changed();
samer@0 90 }
samer@0 91 }
samer@0 92