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
|