JAL-1807 includes ?j2sdebug flag and DebugJS._(msg)
[jalviewjs.git] / bin / javajs / util / Matrix.js
1 Clazz.declarePackage ("javajs.util");
2 c$ = Clazz.decorateAsClass (function () {
3 this.a = null;
4 this.m = 0;
5 this.n = 0;
6 if (!Clazz.isClassDefined ("javajs.util.Matrix.LUDecomp")) {
7 javajs.util.Matrix.$Matrix$LUDecomp$ ();
8 }
9 Clazz.instantialize (this, arguments);
10 }, javajs.util, "Matrix", null, Cloneable);
11 Clazz.makeConstructor (c$, 
12 function (a, m, n) {
13 this.a = (a == null ?  Clazz.newDoubleArray (m, n, 0) : a);
14 this.m = m;
15 this.n = n;
16 }, "~A,~N,~N");
17 Clazz.defineMethod (c$, "getRowDimension", 
18 function () {
19 return this.m;
20 });
21 Clazz.defineMethod (c$, "getColumnDimension", 
22 function () {
23 return this.n;
24 });
25 Clazz.defineMethod (c$, "getArray", 
26 function () {
27 return this.a;
28 });
29 Clazz.defineMethod (c$, "getArrayCopy", 
30 function () {
31 var x =  Clazz.newDoubleArray (this.m, this.n, 0);
32 for (var i = this.m; --i >= 0; ) for (var j = this.n; --j >= 0; ) x[i][j] = this.a[i][j];
33
34
35 return x;
36 });
37 Clazz.defineMethod (c$, "copy", 
38 function () {
39 var x =  new javajs.util.Matrix (null, this.m, this.n);
40 var c = x.a;
41 for (var i = this.m; --i >= 0; ) for (var j = this.n; --j >= 0; ) c[i][j] = this.a[i][j];
42
43
44 return x;
45 });
46 Clazz.overrideMethod (c$, "clone", 
47 function () {
48 return this.copy ();
49 });
50 Clazz.defineMethod (c$, "getSubmatrix", 
51 function (i0, j0, nrows, ncols) {
52 var x =  new javajs.util.Matrix (null, nrows, ncols);
53 var xa = x.a;
54 for (var i = nrows; --i >= 0; ) for (var j = ncols; --j >= 0; ) xa[i][j] = this.a[i0 + i][j0 + j];
55
56
57 return x;
58 }, "~N,~N,~N,~N");
59 Clazz.defineMethod (c$, "getMatrixSelected", 
60 function (r, n) {
61 var x =  new javajs.util.Matrix (null, r.length, n);
62 var xa = x.a;
63 for (var i = r.length; --i >= 0; ) {
64 var b = this.a[r[i]];
65 for (var j = n; --j >= 0; ) xa[i][j] = b[j];
66
67 }
68 return x;
69 }, "~A,~N");
70 Clazz.defineMethod (c$, "transpose", 
71 function () {
72 var x =  new javajs.util.Matrix (null, this.n, this.m);
73 var c = x.a;
74 for (var i = this.m; --i >= 0; ) for (var j = this.n; --j >= 0; ) c[j][i] = this.a[i][j];
75
76
77 return x;
78 });
79 Clazz.defineMethod (c$, "add", 
80 function (b) {
81 return this.scaleAdd (b, 1);
82 }, "javajs.util.Matrix");
83 Clazz.defineMethod (c$, "sub", 
84 function (b) {
85 return this.scaleAdd (b, -1);
86 }, "javajs.util.Matrix");
87 Clazz.defineMethod (c$, "scaleAdd", 
88 function (b, scale) {
89 var x =  new javajs.util.Matrix (null, this.m, this.n);
90 var xa = x.a;
91 var ba = b.a;
92 for (var i = this.m; --i >= 0; ) for (var j = this.n; --j >= 0; ) xa[i][j] = ba[i][j] * scale + this.a[i][j];
93
94
95 return x;
96 }, "javajs.util.Matrix,~N");
97 Clazz.defineMethod (c$, "mul", 
98 function (b) {
99 if (b.m != this.n) return null;
100 var x =  new javajs.util.Matrix (null, this.m, b.n);
101 var xa = x.a;
102 var ba = b.a;
103 for (var j = b.n; --j >= 0; ) for (var i = this.m; --i >= 0; ) {
104 var arowi = this.a[i];
105 var s = 0;
106 for (var k = this.n; --k >= 0; ) s += arowi[k] * ba[k][j];
107
108 xa[i][j] = s;
109 }
110
111 return x;
112 }, "javajs.util.Matrix");
113 Clazz.defineMethod (c$, "inverse", 
114 function () {
115 return Clazz.innerTypeInstance (javajs.util.Matrix.LUDecomp, this, null, this.m, this.n).solve (javajs.util.Matrix.identity (this.m, this.m), this.n);
116 });
117 Clazz.defineMethod (c$, "trace", 
118 function () {
119 var t = 0;
120 for (var i = Math.min (this.m, this.n); --i >= 0; ) t += this.a[i][i];
121
122 return t;
123 });
124 c$.identity = Clazz.defineMethod (c$, "identity", 
125 function (m, n) {
126 var x =  new javajs.util.Matrix (null, m, n);
127 var xa = x.a;
128 for (var i = Math.min (m, n); --i >= 0; ) xa[i][i] = 1;
129
130 return x;
131 }, "~N,~N");
132 Clazz.defineMethod (c$, "getRotation", 
133 function () {
134 return this.getSubmatrix (0, 0, this.m - 1, this.n - 1);
135 });
136 Clazz.defineMethod (c$, "getTranslation", 
137 function () {
138 return this.getSubmatrix (0, this.n - 1, this.m - 1, 1);
139 });
140 c$.newT = Clazz.defineMethod (c$, "newT", 
141 function (r, asColumn) {
142 return (asColumn ?  new javajs.util.Matrix ( Clazz.newArray (-1, [ Clazz.newDoubleArray (-1, [r.x]),  Clazz.newDoubleArray (-1, [r.y]),  Clazz.newDoubleArray (-1, [r.z])]), 3, 1) :  new javajs.util.Matrix ( Clazz.newArray (-1, [ Clazz.newDoubleArray (-1, [r.x, r.y, r.z])]), 1, 3));
143 }, "javajs.util.T3,~B");
144 Clazz.overrideMethod (c$, "toString", 
145 function () {
146 var s = "[\n";
147 for (var i = 0; i < this.m; i++) {
148 s += "  [";
149 for (var j = 0; j < this.n; j++) s += " " + this.a[i][j];
150
151 s += "]\n";
152 }
153 s += "]";
154 return s;
155 });
156 c$.$Matrix$LUDecomp$ = function () {
157 Clazz.pu$h ();
158 c$ = Clazz.decorateAsClass (function () {
159 Clazz.prepareCallback (this, arguments);
160 this.LU = null;
161 this.piv = null;
162 this.pivsign = 0;
163 Clazz.instantialize (this, arguments);
164 }, javajs.util.Matrix, "LUDecomp");
165 Clazz.makeConstructor (c$, 
166 function (a, b) {
167 this.LU = this.b$["javajs.util.Matrix"].getArrayCopy ();
168 this.piv =  Clazz.newIntArray (a, 0);
169 for (var c = a; --c >= 0; ) this.piv[c] = c;
170
171 this.pivsign = 1;
172 var d;
173 var e =  Clazz.newDoubleArray (a, 0);
174 for (var f = 0; f < b; f++) {
175 for (var g = a; --g >= 0; ) e[g] = this.LU[g][f];
176
177 for (var h = a; --h >= 0; ) {
178 d = this.LU[h];
179 var i = Math.min (h, f);
180 var j = 0.0;
181 for (var k = i; --k >= 0; ) j += d[k] * e[k];
182
183 d[f] = e[h] -= j;
184 }
185 var i = f;
186 for (var j = a; --j > f; ) if (Math.abs (e[j]) > Math.abs (e[i])) i = j;
187
188 if (i != f) {
189 for (var k = b; --k >= 0; ) {
190 var l = this.LU[i][k];
191 this.LU[i][k] = this.LU[f][k];
192 this.LU[f][k] = l;
193 }
194 var l = this.piv[i];
195 this.piv[i] = this.piv[f];
196 this.piv[f] = l;
197 this.pivsign = -this.pivsign;
198 }if ( new Boolean (f < a & this.LU[f][f] != 0.0).valueOf ()) for (var k = a; --k > f; ) this.LU[k][f] /= this.LU[f][f];
199
200 }
201 }, "~N,~N");
202 Clazz.defineMethod (c$, "solve", 
203 function (a, b) {
204 for (var c = 0; c < b; c++) if (this.LU[c][c] == 0) return null;
205
206 var d = a.n;
207 var e = a.getMatrixSelected (this.piv, d);
208 var f = e.a;
209 for (var g = 0; g < b; g++) for (var h = g + 1; h < b; h++) for (var i = 0; i < d; i++) f[h][i] -= f[g][i] * this.LU[h][g];
210
211
212
213 for (var j = b; --j >= 0; ) {
214 for (var k = d; --k >= 0; ) f[j][k] /= this.LU[j][j];
215
216 for (var l = j; --l >= 0; ) for (var m = d; --m >= 0; ) f[l][m] -= f[j][m] * this.LU[l][j];
217
218
219 }
220 return e;
221 }, "javajs.util.Matrix,~N");
222 c$ = Clazz.p0p ();
223 };