The code for the new methods is given below.
public class ExtendedTridiagonalMatrix extends TridiagonalMatrix
{
// constructor
public ExtendedTridiagonalMatrix(int theRows, Object theZero)
{super(theRows, theZero);}
// methods
/** create string suitable for output */
public String toString()
{
StringBuffer s = new StringBuffer();
s.append("Lower diagonal is \n");
for (int i = 0; i < rows - 1; i++)
s.append(element[i] + " ");
s.append("\n");
s.append("Main diagonal is \n");
for (int i = rows - 1; i < 2 * rows - 1; i++)
s.append(element[i] + " ");
s.append("\n");
s.append("Upper diagonal is \n");
for (int i = 2 * rows - 1; i < 3 * rows - 2; i++)
s.append(element[i] + " ");
s.append("\n");
// create equivalent String
return new String(s);
}
/** input a tridiagonal matrix from the given input stream */
public void input(Object theZero, MyInputStream inStream)
{
Method inputMethod;
Object [] inputMethodArgs = {inStream};
Class [] parameterTypes = {inStream.getClass()};
zero = theZero;
try
{
// get the proper method to be used to read in the values
inputMethod = theZero.getClass().
getMethod("input", parameterTypes);
// input number of rows in the matrix
System.out.println("Enter number of rows");
rows = inStream.readInteger();
// validate input
if (rows < 1)
throw new IllegalArgumentException
("number of rows must be > 0");
// create the element array
element = new Object [3 * rows - 2];
// input elements
System.out.println("Enter lower diagonal");
for (int i = 0; i < rows - 1; i++)
element[i] = inputMethod.invoke(null, inputMethodArgs);
System.out.println("Enter main diagonal");
for (int i = rows - 1; i < 2 * rows - 1; i++)
element[i] = inputMethod.invoke(null, inputMethodArgs);
System.out.println("Enter upper diagonal");
for (int i = 2 * rows - 1; i < 3 * rows - 2; i++)
element[i] = inputMethod.invoke(null, inputMethodArgs);
}
catch (Exception e)
{
System.out.println(e);
throw new IllegalArgumentException
("matrix element type "
+ "must have the static method input() defined");
}
}
/** return this + b */
public ExtendedTridiagonalMatrix add(ExtendedTridiagonalMatrix b)
{
if (rows != b.rows)
throw new IllegalArgumentException
("Matrices must have same dimensions");
// create result array w
ExtendedTridiagonalMatrix w = new ExtendedTridiagonalMatrix(rows, zero);
for (int i = 0; i < 3 * rows - 2; i++)
w.element[i] = ((Computable) element[i]).add(b.element[i]);
return w;
}
/** return this - b */
public ExtendedTridiagonalMatrix subtract(ExtendedTridiagonalMatrix b)
{
if (rows != b.rows)
throw new IllegalArgumentException
("Matrices must have same dimensions");
// create result array w
ExtendedTridiagonalMatrix w = new ExtendedTridiagonalMatrix(rows, zero);
for (int i = 0; i < 3 * rows - 2; i++)
w.element[i] = ((Computable) element[i]).subtract(b.element[i]);
return w;
}
/** return the transpose of this */
public ExtendedTridiagonalMatrix transpose()
{
// create result array w
ExtendedTridiagonalMatrix w = new ExtendedTridiagonalMatrix(rows, zero);
// copy lower diagonal of this to upper diagonal of w and copy
// the upper diagonal of this to lower diagonal of w
for (int i = 0; i < rows - 1; i++)
{
w.element[2 * rows - 1 + i] = element[i];
w.element[i] = element[2 * rows - 1 + i];
}
// copy main diagonal of this to main dagonal of w
for (int i = rows - 1; i < 2 * rows - 1; i++)
w.element[i] = element[i];
return w;
}
}