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