001 package com.croftsoft.core.math.matrix; 002 003 /*********************************************************************** 004 * Implementation of interface MatrixMut. 005 * 006 * @version 007 * $Id: MatrixImp.java,v 1.5 2008/05/09 18:35:56 croft Exp $ 008 * @since 009 * 2008-04-25 010 * @author 011 * <a href="https://www.croftsoft.com/">David Wallace Croft</a> 012 ***********************************************************************/ 013 014 public class MatrixImp 015 implements MatrixMut 016 //////////////////////////////////////////////////////////////////////// 017 //////////////////////////////////////////////////////////////////////// 018 { 019 020 protected final int 021 rowCount, 022 columnCount; 023 024 protected final double [ ] [ ] values; 025 026 //////////////////////////////////////////////////////////////////////// 027 //////////////////////////////////////////////////////////////////////// 028 029 public MatrixImp ( 030 final int rowCount, 031 final int columnCount ) 032 //////////////////////////////////////////////////////////////////////// 033 { 034 if ( rowCount < 1 ) 035 { 036 throw new IllegalArgumentException ( "rowCount < 1" ); 037 } 038 039 if ( columnCount < 1 ) 040 { 041 throw new IllegalArgumentException ( "columnCount < 1" ); 042 } 043 044 this.rowCount = rowCount; 045 046 this.columnCount = columnCount; 047 048 values = new double [ rowCount ] [ columnCount ]; 049 } 050 051 public MatrixImp ( final Matrix matrix ) 052 //////////////////////////////////////////////////////////////////////// 053 { 054 this ( matrix.getRowCount ( ), matrix.getColumnCount ( ) ); 055 056 for ( int row = 0; row < rowCount; row++ ) 057 { 058 for ( int column = 0; column < columnCount; column++ ) 059 { 060 set ( row, column, matrix.get ( row, column ) ); 061 } 062 } 063 } 064 065 public MatrixImp ( final double [ ] [ ] values ) 066 //////////////////////////////////////////////////////////////////////// 067 { 068 rowCount = values.length; 069 070 columnCount = values [ 0 ].length; 071 072 if ( rowCount < 1 ) 073 { 074 throw new IllegalArgumentException ( "rowCount < 1" ); 075 } 076 077 if ( columnCount < 1 ) 078 { 079 throw new IllegalArgumentException ( "columnCount < 1" ); 080 } 081 082 this.values = new double [ rowCount ] [ columnCount ]; 083 084 for ( int row = 0; row < rowCount; row++ ) 085 { 086 if ( values [ row ].length != columnCount ) 087 { 088 throw new IllegalArgumentException ( 089 "values[" + row + "].length != values[0].length" ); 090 } 091 092 for ( int column = 0; column < columnCount; column++ ) 093 { 094 095 this.values [ row ] [ column ] = values [ row ] [ column ]; 096 } 097 } 098 } 099 100 //////////////////////////////////////////////////////////////////////// 101 // accessor methods 102 //////////////////////////////////////////////////////////////////////// 103 104 public double get ( 105 final int row, 106 final int column ) 107 //////////////////////////////////////////////////////////////////////// 108 { 109 return values [ row ] [ column ]; 110 } 111 112 public int getRowCount ( ) { return rowCount; } 113 114 public int getColumnCount ( ) { return columnCount; } 115 116 //////////////////////////////////////////////////////////////////////// 117 // operand methods 118 //////////////////////////////////////////////////////////////////////// 119 120 public boolean isIdentity ( ) 121 //////////////////////////////////////////////////////////////////////// 122 { 123 if ( rowCount != columnCount ) 124 { 125 return false; 126 } 127 128 for ( int row = 0; row < rowCount; row++ ) 129 { 130 for ( int column = 0; column < columnCount; column++ ) 131 { 132 final double value = values [ row ] [ column ]; 133 134 if ( row == column ) 135 { 136 if ( value != 1 ) 137 { 138 return false; 139 } 140 } 141 else if ( value != 0 ) 142 { 143 return false; 144 } 145 } 146 } 147 148 return true; 149 } 150 151 public boolean isSquare ( ) 152 //////////////////////////////////////////////////////////////////////// 153 { 154 return rowCount == columnCount; 155 } 156 157 public boolean matches ( final Matrix matrix ) 158 //////////////////////////////////////////////////////////////////////// 159 { 160 return MatrixLib.matches ( this, matrix ); 161 } 162 163 public boolean matches ( 164 final Matrix matrix, 165 final double tolerance ) 166 //////////////////////////////////////////////////////////////////////// 167 { 168 return MatrixLib.matches ( this, matrix, tolerance ); 169 } 170 171 //////////////////////////////////////////////////////////////////////// 172 //////////////////////////////////////////////////////////////////////// 173 174 public MatrixMut copy ( ) 175 //////////////////////////////////////////////////////////////////////// 176 { 177 return new MatrixImp ( this ); 178 } 179 180 public MatrixMut multiply ( final Matrix matrix ) 181 //////////////////////////////////////////////////////////////////////// 182 { 183 return MatrixLib.multiply ( this, matrix ); 184 } 185 186 public MatrixMut multiply ( final double scalar ) 187 //////////////////////////////////////////////////////////////////////// 188 { 189 return MatrixLib.multiply ( this, scalar ); 190 } 191 192 //////////////////////////////////////////////////////////////////////// 193 // mutator methods 194 //////////////////////////////////////////////////////////////////////// 195 196 public void copyToSelf ( final Matrix copy ) 197 //////////////////////////////////////////////////////////////////////// 198 { 199 MatrixLib.copyToSelf ( this, copy ); 200 } 201 202 public void multiplyToSelf ( final double scalar ) 203 //////////////////////////////////////////////////////////////////////// 204 { 205 for ( int row = 0; row < rowCount; row++ ) 206 { 207 for ( int column = 0; column < columnCount; column++ ) 208 { 209 values [ row ] [ column ] = values [ row ] [ column ] * scalar; 210 } 211 } 212 } 213 214 public void multiplyToSelf ( final Matrix matrix ) 215 //////////////////////////////////////////////////////////////////////// 216 { 217 MatrixLib.multiplyToSelf ( this, matrix ); 218 } 219 220 public void set ( 221 final int row, 222 final int column, 223 final double value ) 224 //////////////////////////////////////////////////////////////////////// 225 { 226 values [ row ] [ column ] = value; 227 } 228 229 public void setIdentity ( ) 230 //////////////////////////////////////////////////////////////////////// 231 { 232 if ( rowCount != columnCount ) 233 { 234 throw new IllegalArgumentException ( "rowCount != columnCount" ); 235 } 236 237 for ( int row = 0; row < rowCount; row++ ) 238 { 239 for ( int column = 0; column < columnCount; column++ ) 240 { 241 values [ row ] [ column ] = row == column ? 1 : 0; 242 } 243 } 244 } 245 246 public MatrixMut transpose ( ) 247 //////////////////////////////////////////////////////////////////////// 248 { 249 return MatrixLib.transpose ( this ); 250 } 251 252 public void transposeSelf ( ) 253 //////////////////////////////////////////////////////////////////////// 254 { 255 MatrixLib.transposeSelf ( this ); 256 } 257 258 //////////////////////////////////////////////////////////////////////// 259 // overridden Object methods 260 //////////////////////////////////////////////////////////////////////// 261 262 @Override 263 public String toString ( ) 264 //////////////////////////////////////////////////////////////////////// 265 { 266 return MatrixLib.toString ( this ); 267 } 268 269 //////////////////////////////////////////////////////////////////////// 270 //////////////////////////////////////////////////////////////////////// 271 }