import java.io.*;\r
\r
\r
-public class Matrix {\r
+/**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @author $author$\r
+ * @version $Revision$\r
+ */\r
+public class Matrix\r
+{\r
/**\r
* SMJSPUBLIC\r
*/\r
public double[][] value;\r
+\r
+ /** DOCUMENT ME!! */\r
public int rows;\r
+\r
+ /** DOCUMENT ME!! */\r
public int cols;\r
+\r
+ /** DOCUMENT ME!! */\r
public double[] d; // Diagonal\r
+\r
+ /** DOCUMENT ME!! */\r
public double[] e; // off diagonal\r
\r
- public Matrix(double[][] value, int rows, int cols) {\r
+ /**\r
+ * Creates a new Matrix object.\r
+ *\r
+ * @param value DOCUMENT ME!\r
+ * @param rows DOCUMENT ME!\r
+ * @param cols DOCUMENT ME!\r
+ */\r
+ public Matrix(double[][] value, int rows, int cols)\r
+ {\r
this.rows = rows;\r
this.cols = cols;\r
this.value = value;\r
}\r
\r
- public Matrix transpose() {\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @return DOCUMENT ME!\r
+ */\r
+ public Matrix transpose()\r
+ {\r
double[][] out = new double[cols][rows];\r
\r
- for (int i = 0; i < cols; i++) {\r
- for (int j = 0; j < rows; j++) {\r
+ for (int i = 0; i < cols; i++)\r
+ {\r
+ for (int j = 0; j < rows; j++)\r
+ {\r
out[i][j] = value[j][i];\r
}\r
}\r
return new Matrix(out, cols, rows);\r
}\r
\r
- public void print(PrintStream ps) {\r
- for (int i = 0; i < rows; i++) {\r
- for (int j = 0; j < cols; j++) {\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param ps DOCUMENT ME!\r
+ */\r
+ public void print(PrintStream ps)\r
+ {\r
+ for (int i = 0; i < rows; i++)\r
+ {\r
+ for (int j = 0; j < cols; j++)\r
+ {\r
Format.print(ps, "%8.2f", value[i][j]);\r
}\r
\r
}\r
}\r
\r
- public Matrix preMultiply(Matrix in) {\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param in DOCUMENT ME!\r
+ *\r
+ * @return DOCUMENT ME!\r
+ */\r
+ public Matrix preMultiply(Matrix in)\r
+ {\r
double[][] tmp = new double[in.rows][this.cols];\r
\r
- for (int i = 0; i < in.rows; i++) {\r
- for (int j = 0; j < this.cols; j++) {\r
+ for (int i = 0; i < in.rows; i++)\r
+ {\r
+ for (int j = 0; j < this.cols; j++)\r
+ {\r
tmp[i][j] = 0.0;\r
\r
- for (int k = 0; k < in.cols; k++) {\r
+ for (int k = 0; k < in.cols; k++)\r
+ {\r
tmp[i][j] += (in.value[i][k] * this.value[k][j]);\r
}\r
}\r
return new Matrix(tmp, in.rows, this.cols);\r
}\r
\r
- public double[] vectorPostMultiply(double[] in) {\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param in DOCUMENT ME!\r
+ *\r
+ * @return DOCUMENT ME!\r
+ */\r
+ public double[] vectorPostMultiply(double[] in)\r
+ {\r
double[] out = new double[in.length];\r
\r
- for (int i = 0; i < in.length; i++) {\r
+ for (int i = 0; i < in.length; i++)\r
+ {\r
out[i] = 0.0;\r
\r
- for (int k = 0; k < in.length; k++) {\r
+ for (int k = 0; k < in.length; k++)\r
+ {\r
out[i] += (value[i][k] * in[k]);\r
}\r
}\r
return out;\r
}\r
\r
- public Matrix postMultiply(Matrix in) {\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param in DOCUMENT ME!\r
+ *\r
+ * @return DOCUMENT ME!\r
+ */\r
+ public Matrix postMultiply(Matrix in)\r
+ {\r
double[][] out = new double[this.rows][in.cols];\r
\r
- for (int i = 0; i < this.rows; i++) {\r
- for (int j = 0; j < in.cols; j++) {\r
+ for (int i = 0; i < this.rows; i++)\r
+ {\r
+ for (int j = 0; j < in.cols; j++)\r
+ {\r
out[i][j] = 0.0;\r
\r
- for (int k = 0; k < rows; k++) {\r
+ for (int k = 0; k < rows; k++)\r
+ {\r
out[i][j] = out[i][j] + (value[i][k] * in.value[k][j]);\r
}\r
}\r
return new Matrix(out, this.cols, in.rows);\r
}\r
\r
- public Matrix copy() {\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @return DOCUMENT ME!\r
+ */\r
+ public Matrix copy()\r
+ {\r
double[][] newmat = new double[rows][cols];\r
\r
- for (int i = 0; i < rows; i++) {\r
- for (int j = 0; j < cols; j++) {\r
+ for (int i = 0; i < rows; i++)\r
+ {\r
+ for (int j = 0; j < cols; j++)\r
+ {\r
newmat[i][j] = value[i][j];\r
}\r
}\r
return new Matrix(newmat, rows, cols);\r
}\r
\r
- public void tred() {\r
+ /**\r
+ * DOCUMENT ME!\r
+ */\r
+ public void tred()\r
+ {\r
int n = rows;\r
int l;\r
int k;\r
this.d = new double[rows];\r
this.e = new double[rows];\r
\r
- for (i = n; i >= 2; i--) {\r
+ for (i = n; i >= 2; i--)\r
+ {\r
l = i - 1;\r
h = 0.0;\r
scale = 0.0;\r
\r
- if (l > 1) {\r
- for (k = 1; k <= l; k++) {\r
+ if (l > 1)\r
+ {\r
+ for (k = 1; k <= l; k++)\r
+ {\r
scale += Math.abs(value[i - 1][k - 1]);\r
}\r
\r
- if (scale == 0.0) {\r
+ if (scale == 0.0)\r
+ {\r
e[i - 1] = value[i - 1][l - 1];\r
- } else {\r
- for (k = 1; k <= l; k++) {\r
+ }\r
+ else\r
+ {\r
+ for (k = 1; k <= l; k++)\r
+ {\r
value[i - 1][k - 1] /= scale;\r
h += (value[i - 1][k - 1] * value[i - 1][k - 1]);\r
}\r
\r
f = value[i - 1][l - 1];\r
\r
- if (f > 0) {\r
+ if (f > 0)\r
+ {\r
g = -1.0 * Math.sqrt(h);\r
- } else {\r
+ }\r
+ else\r
+ {\r
g = Math.sqrt(h);\r
}\r
\r
value[i - 1][l - 1] = f - g;\r
f = 0.0;\r
\r
- for (j = 1; j <= l; j++) {\r
+ for (j = 1; j <= l; j++)\r
+ {\r
value[j - 1][i - 1] = value[i - 1][j - 1] / h;\r
g = 0.0;\r
\r
- for (k = 1; k <= j; k++) {\r
+ for (k = 1; k <= j; k++)\r
+ {\r
g += (value[j - 1][k - 1] * value[i - 1][k - 1]);\r
}\r
\r
- for (k = j + 1; k <= l; k++) {\r
+ for (k = j + 1; k <= l; k++)\r
+ {\r
g += (value[k - 1][j - 1] * value[i - 1][k - 1]);\r
}\r
\r
\r
hh = f / (h + h);\r
\r
- for (j = 1; j <= l; j++) {\r
+ for (j = 1; j <= l; j++)\r
+ {\r
f = value[i - 1][j - 1];\r
g = e[j - 1] - (hh * f);\r
e[j - 1] = g;\r
\r
- for (k = 1; k <= j; k++) {\r
+ for (k = 1; k <= j; k++)\r
+ {\r
value[j - 1][k - 1] -= ((f * e[k - 1]) +\r
(g * value[i - 1][k - 1]));\r
}\r
}\r
}\r
- } else {\r
+ }\r
+ else\r
+ {\r
e[i - 1] = value[i - 1][l - 1];\r
}\r
\r
d[0] = 0.0;\r
e[0] = 0.0;\r
\r
- for (i = 1; i <= n; i++) {\r
+ for (i = 1; i <= n; i++)\r
+ {\r
l = i - 1;\r
\r
- if (d[i - 1] != 0.0) {\r
- for (j = 1; j <= l; j++) {\r
+ if (d[i - 1] != 0.0)\r
+ {\r
+ for (j = 1; j <= l; j++)\r
+ {\r
g = 0.0;\r
\r
- for (k = 1; k <= l; k++) {\r
+ for (k = 1; k <= l; k++)\r
+ {\r
g += (value[i - 1][k - 1] * value[k - 1][j - 1]);\r
}\r
\r
- for (k = 1; k <= l; k++) {\r
+ for (k = 1; k <= l; k++)\r
+ {\r
value[k - 1][j - 1] -= (g * value[k - 1][i - 1]);\r
}\r
}\r
d[i - 1] = value[i - 1][i - 1];\r
value[i - 1][i - 1] = 1.0;\r
\r
- for (j = 1; j <= l; j++) {\r
+ for (j = 1; j <= l; j++)\r
+ {\r
value[j - 1][i - 1] = 0.0;\r
value[i - 1][j - 1] = 0.0;\r
}\r
}\r
}\r
\r
- public void tqli() {\r
+ /**\r
+ * DOCUMENT ME!\r
+ */\r
+ public void tqli()\r
+ {\r
int n = rows;\r
\r
int m;\r
double c;\r
double b;\r
\r
- for (i = 2; i <= n; i++) {\r
+ for (i = 2; i <= n; i++)\r
+ {\r
e[i - 2] = e[i - 1];\r
}\r
\r
e[n - 1] = 0.0;\r
\r
- for (l = 1; l <= n; l++) {\r
+ for (l = 1; l <= n; l++)\r
+ {\r
iter = 0;\r
\r
- do {\r
- for (m = l; m <= (n - 1); m++) {\r
+ do\r
+ {\r
+ for (m = l; m <= (n - 1); m++)\r
+ {\r
dd = Math.abs(d[m - 1]) + Math.abs(d[m]);\r
\r
- if ((Math.abs(e[m - 1]) + dd) == dd) {\r
+ if ((Math.abs(e[m - 1]) + dd) == dd)\r
+ {\r
break;\r
}\r
}\r
\r
- if (m != l) {\r
+ if (m != l)\r
+ {\r
iter++;\r
\r
- if (iter == 30) {\r
+ if (iter == 30)\r
+ {\r
System.err.print("Too many iterations in tqli");\r
System.exit(0); // JBPNote - should this really be here ???\r
- } else {\r
+ }\r
+ else\r
+ {\r
// System.out.println("Iteration " + iter);\r
}\r
\r
s = c;\r
p = 0.0;\r
\r
- for (i = m - 1; i >= l; i--) {\r
+ for (i = m - 1; i >= l; i--)\r
+ {\r
f = s * e[i - 1];\r
b = c * e[i - 1];\r
\r
- if (Math.abs(f) >= Math.abs(g)) {\r
+ if (Math.abs(f) >= Math.abs(g))\r
+ {\r
c = g / f;\r
r = Math.sqrt((c * c) + 1.0);\r
e[i] = f * r;\r
s = 1.0 / r;\r
c *= s;\r
- } else {\r
+ }\r
+ else\r
+ {\r
s = f / g;\r
r = Math.sqrt((s * s) + 1.0);\r
e[i] = g * r;\r
d[i] = g + p;\r
g = (c * r) - b;\r
\r
- for (k = 1; k <= n; k++) {\r
+ for (k = 1; k <= n; k++)\r
+ {\r
f = value[k - 1][i];\r
value[k - 1][i] = (s * value[k - 1][i - 1]) +\r
(c * f);\r
e[l - 1] = g;\r
e[m - 1] = 0.0;\r
}\r
- } while (m != l);\r
+ }\r
+ while (m != l);\r
}\r
}\r
\r
- public void tred2() {\r
+ /**\r
+ * DOCUMENT ME!\r
+ */\r
+ public void tred2()\r
+ {\r
int n = rows;\r
int l;\r
int k;\r
this.d = new double[rows];\r
this.e = new double[rows];\r
\r
- for (i = n - 1; i >= 1; i--) {\r
+ for (i = n - 1; i >= 1; i--)\r
+ {\r
l = i - 1;\r
h = 0.0;\r
scale = 0.0;\r
\r
- if (l > 0) {\r
- for (k = 0; k < l; k++) {\r
+ if (l > 0)\r
+ {\r
+ for (k = 0; k < l; k++)\r
+ {\r
scale += Math.abs(value[i][k]);\r
}\r
\r
- if (scale == 0.0) {\r
+ if (scale == 0.0)\r
+ {\r
e[i] = value[i][l];\r
- } else {\r
- for (k = 0; k < l; k++) {\r
+ }\r
+ else\r
+ {\r
+ for (k = 0; k < l; k++)\r
+ {\r
value[i][k] /= scale;\r
h += (value[i][k] * value[i][k]);\r
}\r
\r
f = value[i][l];\r
\r
- if (f > 0) {\r
+ if (f > 0)\r
+ {\r
g = -1.0 * Math.sqrt(h);\r
- } else {\r
+ }\r
+ else\r
+ {\r
g = Math.sqrt(h);\r
}\r
\r
value[i][l] = f - g;\r
f = 0.0;\r
\r
- for (j = 0; j < l; j++) {\r
+ for (j = 0; j < l; j++)\r
+ {\r
value[j][i] = value[i][j] / h;\r
g = 0.0;\r
\r
- for (k = 0; k < j; k++) {\r
+ for (k = 0; k < j; k++)\r
+ {\r
g += (value[j][k] * value[i][k]);\r
}\r
\r
- for (k = j; k < l; k++) {\r
+ for (k = j; k < l; k++)\r
+ {\r
g += (value[k][j] * value[i][k]);\r
}\r
\r
\r
hh = f / (h + h);\r
\r
- for (j = 0; j < l; j++) {\r
+ for (j = 0; j < l; j++)\r
+ {\r
f = value[i][j];\r
g = e[j] - (hh * f);\r
e[j] = g;\r
\r
- for (k = 0; k < j; k++) {\r
+ for (k = 0; k < j; k++)\r
+ {\r
value[j][k] -= ((f * e[k]) + (g * value[i][k]));\r
}\r
}\r
}\r
- } else {\r
+ }\r
+ else\r
+ {\r
e[i] = value[i][l];\r
}\r
\r
d[0] = 0.0;\r
e[0] = 0.0;\r
\r
- for (i = 0; i < n; i++) {\r
+ for (i = 0; i < n; i++)\r
+ {\r
l = i - 1;\r
\r
- if (d[i] != 0.0) {\r
- for (j = 0; j < l; j++) {\r
+ if (d[i] != 0.0)\r
+ {\r
+ for (j = 0; j < l; j++)\r
+ {\r
g = 0.0;\r
\r
- for (k = 0; k < l; k++) {\r
+ for (k = 0; k < l; k++)\r
+ {\r
g += (value[i][k] * value[k][j]);\r
}\r
\r
- for (k = 0; k < l; k++) {\r
+ for (k = 0; k < l; k++)\r
+ {\r
value[k][j] -= (g * value[k][i]);\r
}\r
}\r
d[i] = value[i][i];\r
value[i][i] = 1.0;\r
\r
- for (j = 0; j < l; j++) {\r
+ for (j = 0; j < l; j++)\r
+ {\r
value[j][i] = 0.0;\r
value[i][j] = 0.0;\r
}\r
}\r
}\r
\r
- public void tqli2() {\r
+ /**\r
+ * DOCUMENT ME!\r
+ */\r
+ public void tqli2()\r
+ {\r
int n = rows;\r
\r
int m;\r
double c;\r
double b;\r
\r
- for (i = 2; i <= n; i++) {\r
+ for (i = 2; i <= n; i++)\r
+ {\r
e[i - 2] = e[i - 1];\r
}\r
\r
e[n - 1] = 0.0;\r
\r
- for (l = 1; l <= n; l++) {\r
+ for (l = 1; l <= n; l++)\r
+ {\r
iter = 0;\r
\r
- do {\r
- for (m = l; m <= (n - 1); m++) {\r
+ do\r
+ {\r
+ for (m = l; m <= (n - 1); m++)\r
+ {\r
dd = Math.abs(d[m - 1]) + Math.abs(d[m]);\r
\r
- if ((Math.abs(e[m - 1]) + dd) == dd) {\r
+ if ((Math.abs(e[m - 1]) + dd) == dd)\r
+ {\r
break;\r
}\r
}\r
\r
- if (m != l) {\r
+ if (m != l)\r
+ {\r
iter++;\r
\r
- if (iter == 30) {\r
+ if (iter == 30)\r
+ {\r
System.err.print("Too many iterations in tqli");\r
System.exit(0); // JBPNote - same as above - not a graceful exit!\r
- } else {\r
+ }\r
+ else\r
+ {\r
// System.out.println("Iteration " + iter);\r
}\r
\r
s = c;\r
p = 0.0;\r
\r
- for (i = m - 1; i >= l; i--) {\r
+ for (i = m - 1; i >= l; i--)\r
+ {\r
f = s * e[i - 1];\r
b = c * e[i - 1];\r
\r
- if (Math.abs(f) >= Math.abs(g)) {\r
+ if (Math.abs(f) >= Math.abs(g))\r
+ {\r
c = g / f;\r
r = Math.sqrt((c * c) + 1.0);\r
e[i] = f * r;\r
s = 1.0 / r;\r
c *= s;\r
- } else {\r
+ }\r
+ else\r
+ {\r
s = f / g;\r
r = Math.sqrt((s * s) + 1.0);\r
e[i] = g * r;\r
d[i] = g + p;\r
g = (c * r) - b;\r
\r
- for (k = 1; k <= n; k++) {\r
+ for (k = 1; k <= n; k++)\r
+ {\r
f = value[k - 1][i];\r
value[k - 1][i] = (s * value[k - 1][i - 1]) +\r
(c * f);\r
e[l - 1] = g;\r
e[m - 1] = 0.0;\r
}\r
- } while (m != l);\r
+ }\r
+ while (m != l);\r
}\r
}\r
\r
- public double sign(double a, double b) {\r
- if (b < 0) {\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param a DOCUMENT ME!\r
+ * @param b DOCUMENT ME!\r
+ *\r
+ * @return DOCUMENT ME!\r
+ */\r
+ public double sign(double a, double b)\r
+ {\r
+ if (b < 0)\r
+ {\r
return -Math.abs(a);\r
- } else {\r
+ }\r
+ else\r
+ {\r
return Math.abs(a);\r
}\r
}\r
\r
- public double[] getColumn(int n) {\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param n DOCUMENT ME!\r
+ *\r
+ * @return DOCUMENT ME!\r
+ */\r
+ public double[] getColumn(int n)\r
+ {\r
double[] out = new double[rows];\r
\r
- for (int i = 0; i < rows; i++) {\r
+ for (int i = 0; i < rows; i++)\r
+ {\r
out[i] = value[i][n];\r
}\r
\r
return out;\r
}\r
\r
- public void printD(PrintStream ps) {\r
- for (int j = 0; j < rows; j++) {\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param ps DOCUMENT ME!\r
+ */\r
+ public void printD(PrintStream ps)\r
+ {\r
+ for (int j = 0; j < rows; j++)\r
+ {\r
Format.print(ps, "%15.4e", d[j]);\r
}\r
}\r
\r
- public void printE(PrintStream ps) {\r
- for (int j = 0; j < rows; j++) {\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param ps DOCUMENT ME!\r
+ */\r
+ public void printE(PrintStream ps)\r
+ {\r
+ for (int j = 0; j < rows; j++)\r
+ {\r
Format.print(ps, "%15.4e", e[j]);\r
}\r
}\r
\r
- public static void main(String[] args) {\r
+ /**\r
+ * DOCUMENT ME!\r
+ *\r
+ * @param args DOCUMENT ME!\r
+ */\r
+ public static void main(String[] args)\r
+ {\r
int n = Integer.parseInt(args[0]);\r
double[][] in = new double[n][n];\r
\r
- for (int i = 0; i < n; i++) {\r
- for (int j = 0; j < n; j++) {\r
+ for (int i = 0; i < n; i++)\r
+ {\r
+ for (int j = 0; j < n; j++)\r
+ {\r
in[i][j] = (double) Math.random();\r
}\r
}\r