import java.io.PrintStream;
/**
- * DOCUMENT ME!
- *
- * @author $author$
- * @version $Revision$
+ * A class to model rectangular matrices of double values and operations on them
*/
public class Matrix implements MatrixI
{
/*
- * the [row][column] values in the matrix
+ * the cell values in row-major order
*/
private double[][] value;
*/
protected int cols;
- /** DOCUMENT ME!! */
protected double[] d; // Diagonal
- /** DOCUMENT ME!! */
protected double[] e; // off diagonal
/**
public Matrix(double[][] values)
{
this.rows = values.length;
- if (rows > 0)
- {
- this.cols = values[0].length;
- }
+ this.cols = this.rows == 0 ? 0 : values[0].length;
this.value = values;
}
{
for (k = 1; k <= l; k++)
{
- // double v = Math.abs(value[i - 1][k - 1]);
double v = Math.abs(getValue(i - 1, k - 1));
scale += v;
}
if (scale == 0.0)
{
- // e[i - 1] = value[i - 1][l - 1];
e[i - 1] = getValue(i - 1, l - 1);
}
else
{
for (k = 1; k <= l; k++)
{
- // value[i - 1][k - 1] /= scale;
- // h += (value[i - 1][k - 1] * value[i - 1][k - 1]);
double v = divideValue(i - 1, k - 1, scale);
h += v * v;
}
- // f = value[i - 1][l - 1];
f = getValue(i - 1, l - 1);
if (f > 0)
e[i - 1] = scale * g;
h -= (f * g);
- // value[i - 1][l - 1] = f - g;
setValue(i - 1, l - 1, f - g);
- // System.out.println(String.format("%d %d %f %f %f %f %f %.5e", i,
- // l,
- // scale, f, g, h, getValue(i - 1, l - 1), checksum()));
f = 0.0;
for (j = 1; j <= l; j++)
{
- // value[j - 1][i - 1] = value[i - 1][j - 1] / h;
double val = getValue(i - 1, j - 1) / h;
setValue(j - 1, i - 1, val);
g = 0.0;
for (k = 1; k <= j; k++)
{
- // g += (value[j - 1][k - 1] * value[i - 1][k - 1]);
g += (getValue(j - 1, k - 1) * getValue(i - 1, k - 1));
}
for (k = j + 1; k <= l; k++)
{
- // g += (value[k - 1][j - 1] * value[i - 1][k - 1]);
g += (getValue(k - 1, j - 1) * getValue(i - 1, k - 1));
}
e[j - 1] = g / h;
- // f += (e[j - 1] * value[i - 1][j - 1]);
f += (e[j - 1] * getValue(i - 1, j - 1));
}
for (j = 1; j <= l; j++)
{
- // f = value[i - 1][j - 1];
f = getValue(i - 1, j - 1);
g = e[j - 1] - (hh * f);
e[j - 1] = g;
for (k = 1; k <= j; k++)
{
- // value[j - 1][k - 1] -= ((f * e[k - 1]) + (g * value[i - 1][k -
- // 1]));
double val = (f * e[k - 1]) + (g * getValue(i - 1, k - 1));
addValue(j - 1, k - 1, -val);
}
}
else
{
- // e[i - 1] = value[i - 1][l - 1];
e[i - 1] = getValue(i - 1, l - 1);
}
for (k = 1; k <= l; k++)
{
- // g += (value[i - 1][k - 1] * value[k - 1][j - 1]);
g += (getValue(i - 1, k - 1) * getValue(k - 1, j - 1));
}
for (k = 1; k <= l; k++)
{
- // value[k - 1][j - 1] -= (g * value[k - 1][i - 1]);
addValue(k - 1, j - 1, -(g * getValue(k - 1, i - 1)));
}
}
}
- // d[i - 1] = value[i - 1][i - 1];
- // value[i - 1][i - 1] = 1.0;
d[i - 1] = getValue(i - 1, i - 1);
setValue(i - 1, i - 1, 1.0);
for (j = 1; j <= l; j++)
{
- // value[j - 1][i - 1] = 0.0;
- // value[i - 1][j - 1] = 0.0;
setValue(j - 1, i - 1, 0.0);
setValue(i - 1, j - 1, 0.0);
}
for (k = 1; k <= n; k++)
{
- // f = value[k - 1][i];
- // value[k - 1][i] = (s * value[k - 1][i - 1]) + (c * f);
- // value[k - 1][i - 1] = (c * value[k - 1][i - 1]) - (s * f);
f = getValue(k - 1, i);
setValue(k - 1, i, (s * getValue(k - 1, i - 1)) + (c * f));
setValue(k - 1, i - 1, (c * getValue(k - 1, i - 1)) - (s * f));