1 Clazz.declarePackage ("jalview.math");
\r
2 Clazz.load (null, "jalview.math.Matrix", ["jalview.util.Format", "$.MessageManager", "java.lang.Exception"], function () {
\r
3 c$ = Clazz.decorateAsClass (function () {
\r
10 Clazz.instantialize (this, arguments);
\r
11 }, jalview.math, "Matrix");
\r
12 Clazz.makeConstructor (c$,
\r
13 function (value, rows, cols) {
\r
18 Clazz.defineMethod (c$, "transpose",
\r
20 var out = Clazz.newDoubleArray (this.cols, this.rows, 0);
\r
21 for (var i = 0; i < this.cols; i++) {
\r
22 for (var j = 0; j < this.rows; j++) {
\r
23 out[i][j] = this.value[j][i];
\r
26 return new jalview.math.Matrix (out, this.cols, this.rows);
\r
28 Clazz.defineMethod (c$, "print",
\r
30 for (var i = 0; i < this.rows; i++) {
\r
31 for (var j = 0; j < this.cols; j++) {
\r
32 jalview.util.Format.printDouble (ps, "%8.2f", this.value[i][j]);
\r
36 }, "java.io.PrintStream");
\r
37 Clazz.defineMethod (c$, "preMultiply",
\r
39 var tmp = Clazz.newDoubleArray ($in.rows, this.cols, 0);
\r
40 for (var i = 0; i < $in.rows; i++) {
\r
41 for (var j = 0; j < this.cols; j++) {
\r
43 for (var k = 0; k < $in.cols; k++) {
\r
44 tmp[i][j] += ($in.value[i][k] * this.value[k][j]);
\r
48 return new jalview.math.Matrix (tmp, $in.rows, this.cols);
\r
49 }, "jalview.math.Matrix");
\r
50 Clazz.defineMethod (c$, "vectorPostMultiply",
\r
52 var out = Clazz.newDoubleArray ($in.length, 0);
\r
53 for (var i = 0; i < $in.length; i++) {
\r
55 for (var k = 0; k < $in.length; k++) {
\r
56 out[i] += (this.value[i][k] * $in[k]);
\r
61 Clazz.defineMethod (c$, "postMultiply",
\r
63 var out = Clazz.newDoubleArray (this.rows, $in.cols, 0);
\r
64 for (var i = 0; i < this.rows; i++) {
\r
65 for (var j = 0; j < $in.cols; j++) {
\r
67 for (var k = 0; k < this.rows; k++) {
\r
68 out[i][j] = out[i][j] + (this.value[i][k] * $in.value[k][j]);
\r
72 return new jalview.math.Matrix (out, this.cols, $in.rows);
\r
73 }, "jalview.math.Matrix");
\r
74 Clazz.defineMethod (c$, "copy",
\r
76 var newmat = Clazz.newDoubleArray (this.rows, this.cols, 0);
\r
77 for (var i = 0; i < this.rows; i++) {
\r
78 for (var j = 0; j < this.cols; j++) {
\r
79 newmat[i][j] = this.value[i][j];
\r
82 return new jalview.math.Matrix (newmat, this.rows, this.cols);
\r
84 Clazz.defineMethod (c$, "tred",
\r
96 this.d = Clazz.newDoubleArray (this.rows, 0);
\r
97 this.e = Clazz.newDoubleArray (this.rows, 0);
\r
98 for (i = n; i >= 2; i--) {
\r
103 for (k = 1; k <= l; k++) {
\r
104 scale += Math.abs (this.value[i - 1][k - 1]);
\r
106 if (scale == 0.0) {
\r
107 this.e[i - 1] = this.value[i - 1][l - 1];
\r
109 for (k = 1; k <= l; k++) {
\r
110 this.value[i - 1][k - 1] /= scale;
\r
111 h += (this.value[i - 1][k - 1] * this.value[i - 1][k - 1]);
\r
113 f = this.value[i - 1][l - 1];
\r
115 g = -1.0 * Math.sqrt (h);
\r
118 }this.e[i - 1] = scale * g;
\r
120 this.value[i - 1][l - 1] = f - g;
\r
122 for (j = 1; j <= l; j++) {
\r
123 this.value[j - 1][i - 1] = this.value[i - 1][j - 1] / h;
\r
125 for (k = 1; k <= j; k++) {
\r
126 g += (this.value[j - 1][k - 1] * this.value[i - 1][k - 1]);
\r
128 for (k = j + 1; k <= l; k++) {
\r
129 g += (this.value[k - 1][j - 1] * this.value[i - 1][k - 1]);
\r
131 this.e[j - 1] = g / h;
\r
132 f += (this.e[j - 1] * this.value[i - 1][j - 1]);
\r
135 for (j = 1; j <= l; j++) {
\r
136 f = this.value[i - 1][j - 1];
\r
137 g = this.e[j - 1] - (hh * f);
\r
139 for (k = 1; k <= j; k++) {
\r
140 this.value[j - 1][k - 1] -= ((f * this.e[k - 1]) + (g * this.value[i - 1][k - 1]));
\r
144 this.e[i - 1] = this.value[i - 1][l - 1];
\r
145 }this.d[i - 1] = h;
\r
149 for (i = 1; i <= n; i++) {
\r
151 if (this.d[i - 1] != 0.0) {
\r
152 for (j = 1; j <= l; j++) {
\r
154 for (k = 1; k <= l; k++) {
\r
155 g += (this.value[i - 1][k - 1] * this.value[k - 1][j - 1]);
\r
157 for (k = 1; k <= l; k++) {
\r
158 this.value[k - 1][j - 1] -= (g * this.value[k - 1][i - 1]);
\r
161 }this.d[i - 1] = this.value[i - 1][i - 1];
\r
162 this.value[i - 1][i - 1] = 1.0;
\r
163 for (j = 1; j <= l; j++) {
\r
164 this.value[j - 1][i - 1] = 0.0;
\r
165 this.value[i - 1][j - 1] = 0.0;
\r
169 Clazz.defineMethod (c$, "tqli",
\r
185 for (i = 2; i <= n; i++) {
\r
186 this.e[i - 2] = this.e[i - 1];
\r
188 this.e[n - 1] = 0.0;
\r
189 for (l = 1; l <= n; l++) {
\r
192 for (m = l; m <= (n - 1); m++) {
\r
193 dd = Math.abs (this.d[m - 1]) + Math.abs (this.d[m]);
\r
194 if ((Math.abs (this.e[m - 1]) + dd) == dd) {
\r
199 if (iter == this.maxIter) {
\r
200 throw new Exception (jalview.util.MessageManager.formatMessage ("exception.matrix_too_many_iteration", Clazz.newArray (-1, ["tqli", Integer.$valueOf (this.maxIter).toString ()])));
\r
202 }g = (this.d[l] - this.d[l - 1]) / (2.0 * this.e[l - 1]);
\r
203 r = Math.sqrt ((g * g) + 1.0);
\r
204 g = this.d[m - 1] - this.d[l - 1] + (this.e[l - 1] / (g + this.sign (r, g)));
\r
208 for (i = m - 1; i >= l; i--) {
\r
209 f = s * this.e[i - 1];
\r
210 b = c * this.e[i - 1];
\r
211 if (Math.abs (f) >= Math.abs (g)) {
\r
213 r = Math.sqrt ((c * c) + 1.0);
\r
219 r = Math.sqrt ((s * s) + 1.0);
\r
223 }g = this.d[i] - p;
\r
224 r = ((this.d[i - 1] - g) * s) + (2.0 * c * b);
\r
228 for (k = 1; k <= n; k++) {
\r
229 f = this.value[k - 1][i];
\r
230 this.value[k - 1][i] = (s * this.value[k - 1][i - 1]) + (c * f);
\r
231 this.value[k - 1][i - 1] = (c * this.value[k - 1][i - 1]) - (s * f);
\r
234 this.d[l - 1] = this.d[l - 1] - p;
\r
236 this.e[m - 1] = 0.0;
\r
240 Clazz.defineMethod (c$, "tred2",
\r
252 this.d = Clazz.newDoubleArray (this.rows, 0);
\r
253 this.e = Clazz.newDoubleArray (this.rows, 0);
\r
254 for (i = n - 1; i >= 1; i--) {
\r
259 for (k = 0; k < l; k++) {
\r
260 scale += Math.abs (this.value[i][k]);
\r
262 if (scale == 0.0) {
\r
263 this.e[i] = this.value[i][l];
\r
265 for (k = 0; k < l; k++) {
\r
266 this.value[i][k] /= scale;
\r
267 h += (this.value[i][k] * this.value[i][k]);
\r
269 f = this.value[i][l];
\r
271 g = -1.0 * Math.sqrt (h);
\r
274 }this.e[i] = scale * g;
\r
276 this.value[i][l] = f - g;
\r
278 for (j = 0; j < l; j++) {
\r
279 this.value[j][i] = this.value[i][j] / h;
\r
281 for (k = 0; k < j; k++) {
\r
282 g += (this.value[j][k] * this.value[i][k]);
\r
284 for (k = j; k < l; k++) {
\r
285 g += (this.value[k][j] * this.value[i][k]);
\r
288 f += (this.e[j] * this.value[i][j]);
\r
291 for (j = 0; j < l; j++) {
\r
292 f = this.value[i][j];
\r
293 g = this.e[j] - (hh * f);
\r
295 for (k = 0; k < j; k++) {
\r
296 this.value[j][k] -= ((f * this.e[k]) + (g * this.value[i][k]));
\r
300 this.e[i] = this.value[i][l];
\r
305 for (i = 0; i < n; i++) {
\r
307 if (this.d[i] != 0.0) {
\r
308 for (j = 0; j < l; j++) {
\r
310 for (k = 0; k < l; k++) {
\r
311 g += (this.value[i][k] * this.value[k][j]);
\r
313 for (k = 0; k < l; k++) {
\r
314 this.value[k][j] -= (g * this.value[k][i]);
\r
317 }this.d[i] = this.value[i][i];
\r
318 this.value[i][i] = 1.0;
\r
319 for (j = 0; j < l; j++) {
\r
320 this.value[j][i] = 0.0;
\r
321 this.value[i][j] = 0.0;
\r
325 Clazz.defineMethod (c$, "tqli2",
\r
341 for (i = 2; i <= n; i++) {
\r
342 this.e[i - 2] = this.e[i - 1];
\r
344 this.e[n - 1] = 0.0;
\r
345 for (l = 1; l <= n; l++) {
\r
348 for (m = l; m <= (n - 1); m++) {
\r
349 dd = Math.abs (this.d[m - 1]) + Math.abs (this.d[m]);
\r
350 if ((Math.abs (this.e[m - 1]) + dd) == dd) {
\r
355 if (iter == this.maxIter) {
\r
356 throw new Exception (jalview.util.MessageManager.formatMessage ("exception.matrix_too_many_iteration", Clazz.newArray (-1, ["tqli2", Integer.$valueOf (this.maxIter).toString ()])));
\r
358 }g = (this.d[l] - this.d[l - 1]) / (2.0 * this.e[l - 1]);
\r
359 r = Math.sqrt ((g * g) + 1.0);
\r
360 g = this.d[m - 1] - this.d[l - 1] + (this.e[l - 1] / (g + this.sign (r, g)));
\r
364 for (i = m - 1; i >= l; i--) {
\r
365 f = s * this.e[i - 1];
\r
366 b = c * this.e[i - 1];
\r
367 if (Math.abs (f) >= Math.abs (g)) {
\r
369 r = Math.sqrt ((c * c) + 1.0);
\r
375 r = Math.sqrt ((s * s) + 1.0);
\r
379 }g = this.d[i] - p;
\r
380 r = ((this.d[i - 1] - g) * s) + (2.0 * c * b);
\r
384 for (k = 1; k <= n; k++) {
\r
385 f = this.value[k - 1][i];
\r
386 this.value[k - 1][i] = (s * this.value[k - 1][i - 1]) + (c * f);
\r
387 this.value[k - 1][i - 1] = (c * this.value[k - 1][i - 1]) - (s * f);
\r
390 this.d[l - 1] = this.d[l - 1] - p;
\r
392 this.e[m - 1] = 0.0;
\r
396 Clazz.defineMethod (c$, "sign",
\r
399 return -Math.abs (a);
\r
401 return Math.abs (a);
\r
403 Clazz.defineMethod (c$, "getColumn",
\r
405 var out = Clazz.newDoubleArray (this.rows, 0);
\r
406 for (var i = 0; i < this.rows; i++) {
\r
407 out[i] = this.value[i][n];
\r
411 Clazz.defineMethod (c$, "printD",
\r
413 for (var j = 0; j < this.rows; j++) {
\r
414 jalview.util.Format.printDouble (ps, "%15.4e", this.d[j]);
\r
416 }, "java.io.PrintStream");
\r
417 Clazz.defineMethod (c$, "printE",
\r
419 for (var j = 0; j < this.rows; j++) {
\r
420 jalview.util.Format.printDouble (ps, "%15.4e", this.e[j]);
\r
422 }, "java.io.PrintStream");
\r