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