public class TriangularMatrix extends Matrix { //Data-elements private double[] elements; //Constructors public TriangularMatrix(int rows,int cols) { if(rows!=cols) throw new RuntimeException("Illegal matrix dimensions!"); n=m=rows; elements=new double[((1+n)*n)/2]; } public TriangularMatrix(double[][] data) { this(data.length,data[0].length); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) setElementAt(i+1,j+1,data[i][j]); } public TriangularMatrix(Matrix arg) { this(arg.getRows(),arg.getColumns()); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) setElementAt(i,j,arg.elementAt(i,j)); } //Override protected int f(int i,int j) { super.f(i,j); return (i*(i-1))/2+j-1; } //Implementation of abstract methods public double elementAt(int i,int j) { int k=f(i,j); double result=elements[k]; return j<=i ? result : 0; } public double setElementAt(int i,int j,double value) { int k=f(i,j); double oldValue=elements[k]; if(j<=i) elements[k]=value; else if(value!=0) throw new RuntimeException("Incorrect value!"); return oldValue; } protected Matrix create(int rows,int cols) { return new TriangularMatrix(rows,cols); } //Override public Matrix add(Matrix B) { if(B instanceof TriangularMatrix) return plus((TriangularMatrix)B); Matrix A=new OrdinaryMatrix(this); return A.add(B); } //Private method private TriangularMatrix plus(TriangularMatrix B) { Matrix A = this; if (B.n != A.n) throw new RuntimeException("Illegal matrix dimensions!"); TriangularMatrix C = new TriangularMatrix(n,n); for (int i = 1; i <= n; i++) for (int j = 1; j <= i; j++) C.setElementAt(i,j,A.elementAt(i,j) + B.elementAt(i,j)); return C; } //Other public methods - inherited from Matrix }