1 2 package JSci.maths.matrices; 3 4 import JSci.maths.ExtraMath; 5 import JSci.maths.Mapping; 6 import JSci.maths.DimensionException; 7 import JSci.maths.vectors.AbstractIntegerVector; 8 import JSci.maths.vectors.IntegerVector; 9 import JSci.maths.groups.AbelianGroup; 10 import JSci.maths.algebras.*; 11 import JSci.maths.fields.*; 12 13 18 public class IntegerMatrix extends AbstractIntegerMatrix { 19 22 protected final int matrix[][]; 23 27 public IntegerMatrix(final int array[][]) { 28 super(array.length, array[0].length); 29 matrix=array; 30 } 31 34 public IntegerMatrix(final int rows,final int cols) { 35 this(new int[rows][cols]); 36 } 37 41 public IntegerMatrix(final AbstractIntegerVector array[]) { 42 this(array[0].dimension(), array.length); 43 for(int i=0;i<numRows;i++) { 44 for(int j=0;j<numCols;j++) 45 matrix[i][j]=array[j].getComponent(i); 46 } 47 } 48 52 public boolean equals(AbstractIntegerMatrix m, double tol) { 53 if(m != null && numRows == m.rows() && numCols == m.columns()) { 54 int sumSqr = 0; 55 for(int i=0;i<numRows;i++) { 56 for(int j=0;j<numCols;j++) { 57 int delta = matrix[i][j]-m.getElement(i,j); 58 sumSqr += delta*delta; 59 } 60 } 61 return (sumSqr <= tol*tol); 62 } else { 63 return false; 64 } 65 } 66 69 public String toString() { 70 final StringBuffer buf=new StringBuffer (5*numRows*numCols); 71 for(int i=0;i<numRows;i++) { 72 for(int j=0;j<numCols;j++) { 73 buf.append(matrix[i][j]); 74 buf.append(' '); 75 } 76 buf.append('\n'); 77 } 78 return buf.toString(); 79 } 80 84 public AbstractDoubleMatrix toDoubleMatrix() { 85 final double ans[][]=new double[numRows][numCols]; 86 for(int i=0;i<numRows;i++) { 87 for(int j=0;j<numCols;j++) 88 ans[i][j]=matrix[i][j]; 89 } 90 return new DoubleMatrix(ans); 91 } 92 96 public AbstractComplexMatrix toComplexMatrix() { 97 ComplexMatrix cm = new ComplexMatrix(numRows, numCols); 98 for(int i=0;i<numRows;i++) { 99 for(int j=0;j<numCols;j++) 100 cm.setElement(i, j, matrix[i][j], 0.0); 101 } 102 return cm; 103 } 104 110 public int getElement(int i, int j) { 111 if(i>=0 && i<numRows && j>=0 && j<numCols) 112 return matrix[i][j]; 113 else 114 throw new MatrixDimensionException(getInvalidElementMsg(i,j)); 115 } 116 124 public void setElement(int i, int j, int x) { 125 if(i>=0 && i<numRows && j>=0 && j<numCols) 126 matrix[i][j]=x; 127 else 128 throw new MatrixDimensionException(getInvalidElementMsg(i,j)); 129 } 130 134 public int infNorm() { 135 int result=0,tmpResult; 136 for(int i=0;i<numRows;i++) { 137 tmpResult=0; 138 for(int j=0;j<numCols;j++) 139 tmpResult+=Math.abs(matrix[i][j]); 140 if(tmpResult>result) 141 result=tmpResult; 142 } 143 return result; 144 } 145 149 public double frobeniusNorm() { 150 double result=0.0; 151 for(int j,i=0;i<numRows;i++) { 152 for(j=0;j<numCols;j++) 153 result=ExtraMath.hypot(result, matrix[i][j]); 154 } 155 return result; 156 } 157 158 162 165 public AbelianGroup.Member negate() { 166 final int array[][]=new int[numRows][numCols]; 167 for(int i=0;i<numRows;i++) { 168 array[i][0] = -matrix[i][0]; 169 for(int j=1;j<numCols;j++) 170 array[i][j] = -matrix[i][j]; 171 } 172 return new IntegerMatrix(array); 173 } 174 175 177 182 public AbstractIntegerMatrix add(final AbstractIntegerMatrix m) { 183 if(numRows==m.rows() && numCols==m.columns()) { 184 final int array[][]=new int[numRows][numCols]; 185 for(int i=0;i<numRows;i++) { 186 array[i][0] = matrix[i][0]+m.getElement(i,0); 187 for(int j=1;j<numCols;j++) 188 array[i][j] = matrix[i][j]+m.getElement(i,j); 189 } 190 return new IntegerMatrix(array); 191 } else { 192 throw new MatrixDimensionException("Matrices are different sizes."); 193 } 194 } 195 196 198 203 public AbstractIntegerMatrix subtract(final AbstractIntegerMatrix m) { 204 if(numRows==m.rows() && numCols==m.columns()) { 205 final int array[][]=new int[numRows][numCols]; 206 for(int i=0;i<numRows;i++) { 207 array[i][0] = matrix[i][0]-m.getElement(i,0); 208 for(int j=1;j<numCols;j++) 209 array[i][j] = matrix[i][j]-m.getElement(i,j); 210 } 211 return new IntegerMatrix(array); 212 } else { 213 throw new MatrixDimensionException("Matrices are different sizes."); 214 } 215 } 216 217 219 224 public AbstractIntegerMatrix scalarMultiply(final int x) { 225 final int array[][]=new int[numRows][numCols]; 226 for(int i=0;i<numRows;i++) { 227 array[i][0] = x*matrix[i][0]; 228 for(int j=1;j<numCols;j++) 229 array[i][j] = x*matrix[i][j]; 230 } 231 return new IntegerMatrix(array); 232 } 233 234 236 237 239 244 public int scalarProduct(final AbstractIntegerMatrix m) { 245 if(m instanceof IntegerMatrix) 246 return scalarProduct((IntegerMatrix)m); 247 248 if(numRows==m.rows() && numCols==m.columns()) { 249 int ans=0; 250 for(int i=0;i<numRows;i++) { 251 ans += matrix[i][0]*m.getElement(i,0); 252 for(int j=1;j<numCols;j++) 253 ans += matrix[i][j]*m.getElement(i,j); 254 } 255 return ans; 256 } else { 257 throw new MatrixDimensionException("Matrices are different sizes."); 258 } 259 } 260 public int scalarProduct(final IntegerMatrix m) { 261 if(numRows==m.numRows && numCols==m.numCols) { 262 int ans=0; 263 for(int i=0;i<numRows;i++) { 264 ans+=matrix[i][0]*m.matrix[i][0]; 265 for(int j=1;j<numCols;j++) 266 ans+=matrix[i][j]*m.matrix[i][j]; 267 } 268 return ans; 269 } else 270 throw new MatrixDimensionException("Matrices are different sizes."); 271 } 272 273 275 280 public AbstractIntegerVector multiply(final AbstractIntegerVector v) { 281 if(numCols==v.dimension()) { 282 final int array[]=new int[numRows]; 283 for(int i=0;i<numRows;i++) { 284 array[i]=matrix[i][0]*v.getComponent(0); 285 for(int j=1;j<numCols;j++) 286 array[i]+=matrix[i][j]*v.getComponent(j); 287 } 288 return new IntegerVector(array); 289 } else { 290 throw new DimensionException("Matrix and vector are incompatible."); 291 } 292 } 293 299 public AbstractIntegerMatrix multiply(final AbstractIntegerMatrix m) { 300 if(m instanceof IntegerMatrix) 301 return multiply((IntegerMatrix)m); 302 303 if(numCols==m.rows()) { 304 final int mColumns = m.columns(); 305 final int array[][]=new int[numRows][mColumns]; 306 for(int j=0; j<numRows; j++) { 307 for(int k=0; k<mColumns; k++) { 308 array[j][k] = matrix[j][0]*m.getElement(0,k); 309 for(int n=1; n<numCols; n++) 310 array[j][k] += matrix[j][n]*m.getElement(n,k); 311 } 312 } 313 if(numRows == mColumns) 314 return new IntegerSquareMatrix(array); 315 else 316 return new IntegerMatrix(array); 317 } else { 318 throw new MatrixDimensionException("Incompatible matrices."); 319 } 320 } 321 public AbstractIntegerMatrix multiply(final IntegerMatrix m) { 322 if(numCols==m.numRows) { 323 final int array[][]=new int[numRows][m.numCols]; 324 for(int j=0;j<numRows;j++) { 325 for(int k=0;k<m.numCols;k++) { 326 array[j][k]=matrix[j][0]*m.matrix[0][k]; 327 for(int n=1;n<numCols;n++) 328 array[j][k]+=matrix[j][n]*m.matrix[n][k]; 329 } 330 } 331 if(numRows == m.numCols) 332 return new IntegerSquareMatrix(array); 333 else 334 return new IntegerMatrix(array); 335 } else 336 throw new MatrixDimensionException("Incompatible matrices."); 337 } 338 339 341 344 public AbstractIntegerMatrix directSum(final AbstractIntegerMatrix m) { 345 final int array[][]=new int[numRows+m.numRows][numCols+m.numCols]; 346 for(int i=0;i<numRows;i++) { 347 for(int j=0;j<numCols;j++) 348 array[i][j] = matrix[i][j]; 349 } 350 for(int i=0;i<m.numRows;i++) { 351 for(int j=0;j<m.numCols;j++) 352 array[i+numRows][j+numCols] = m.getElement(i,j); 353 } 354 return new IntegerMatrix(array); 355 } 356 357 359 362 public AbstractIntegerMatrix tensor(final AbstractIntegerMatrix m) { 363 final int array[][]=new int[numRows*m.numRows][numCols*m.numCols]; 364 for(int i=0;i<numRows;i++) { 365 for(int j=0;j<numCols;j++) { 366 for(int k=0;k<m.numRows;j++) { 367 for(int l=0;l<m.numCols;l++) 368 array[i*m.numRows+k][j*m.numCols+l] = matrix[i][j]*m.getElement(k,l); 369 } 370 } 371 } 372 return new IntegerMatrix(array); 373 } 374 375 377 381 public Matrix transpose() { 382 final int array[][]=new int[numCols][numRows]; 383 for(int i=0;i<numRows;i++) { 384 array[0][i] = matrix[i][0]; 385 for(int j=1;j<numCols;j++) 386 array[j][i] = matrix[i][j]; 387 } 388 return new IntegerMatrix(array); 389 } 390 391 } 392 | Popular Tags |