1 9 package org.jscience.physics.measures; 10 11 import javax.measure.converters.ConversionException; 12 import javax.measure.quantities.Quantity; 13 import javax.measure.units.Unit; 14 import javax.realtime.MemoryArea; 15 16 import javolution.context.PoolContext; 17 import org.jscience.mathematics.structures.VectorSpaceNormed; 18 import org.jscience.mathematics.vectors.DimensionException; 19 import org.jscience.mathematics.vectors.Vector; 20 21 33 public class MeasureVector<Q extends Quantity> extends Vector<Measure<?>> 34 implements VectorSpaceNormed<Vector<Measure<?>>, Measure<?>> { 35 36 39 Measure<Q>[] _elements; 40 41 44 int _dimension; 45 46 51 @SuppressWarnings ("unchecked") 52 public MeasureVector(Measure<Q> ... elements) { 53 _dimension = elements.length; 54 _elements = new Measure[_dimension]; 55 for (int i = 0; i < _dimension; i++) { 56 _elements[i] = elements[i]; 57 } 58 } 59 60 69 public static <Q extends Quantity> MeasureVector<Q> valueOf(Measure<Q> ... elements) { 70 int n = elements.length; 71 MeasureVector<Q> V = MeasureVector.newInstance(n); 72 for (int i = 0; i < n; i++) { 73 V._elements[i] = elements[i]; 74 } 75 return V; 76 } 77 78 86 public static <Q extends Quantity> MeasureVector<Q> valueOf(Unit<Q> unit, Vector<Measure<?>> that) { 87 int n = that.getDimension(); 88 MeasureVector<Q> V = MeasureVector.newInstance(n); 89 for (int i = 0; i < n; i++) { 90 V._elements[i] = that.get(i).to(unit); 91 } 92 return V; 93 } 94 95 103 public static <Q extends Quantity> MeasureVector<Q> valueOf(Unit<Q> unit, 104 long... values) { 105 final int d = values.length; 106 MeasureVector<Q> V = MeasureVector.newInstance(d); 107 for (int i = 0; i < d; i++) { 108 V._elements[i] = Measure.valueOf(values[i], unit); 109 } 110 return V; 111 } 112 113 121 public static <Q extends Quantity> MeasureVector<Q> valueOf(Unit<Q> unit, 122 double... values) { 123 final int d = values.length; 124 MeasureVector<Q> V = MeasureVector.newInstance(d); 125 for (int i = 0; i < d; i++) { 126 V._elements[i] = Measure.valueOf(values[i], unit); 127 } 128 return V; 129 } 130 131 137 public static void recycle(MeasureVector vector) { 138 FACTORY.recycle(vector); 139 } 140 141 147 @SuppressWarnings ("unchecked") 148 public Measure<Q> norm() { 149 Measure<?> normSquared = _elements[0].times(_elements[0]); 150 for (int i = 1; i < _dimension; i++) { 151 normSquared = normSquared.plus(_elements[i].times(_elements[i])); 152 } 153 return (Measure<Q>) normSquared.sqrt(); 154 } 155 156 166 @SuppressWarnings ("unchecked") 167 public <R extends Quantity> MeasureVector<R> to(Unit<R> unit) { 168 MeasureVector<R> V = MeasureVector.newInstance(_dimension); 169 for (int i = 0; i < _dimension; i++) { 170 V._elements[i] = _elements[i].to(unit); 171 } 172 return V; 173 } 174 175 @Override 176 public final int getDimension() { 177 return _dimension; 178 } 179 180 @Override 181 public final Measure<Q> get(int i) { 182 if (i >= _dimension) 183 throw new IndexOutOfBoundsException (); 184 return _elements[i]; 185 } 186 187 @Override 188 public MeasureVector<Q> opposite() { 189 MeasureVector<Q> V = MeasureVector.newInstance(_dimension); 190 for (int i = 0; i < _dimension; i++) { 191 V._elements[i] = _elements[i].opposite(); 192 } 193 return V; 194 } 195 196 @Override 197 public MeasureVector<Q> plus(Vector<Measure<?>> that) { 198 MeasureVector<Q> T = MeasureVector.valueOf(_elements[0].getUnit(), that); 199 if (T._dimension != _dimension) throw new DimensionException(); 200 MeasureVector<Q> V = MeasureVector.newInstance(_dimension); 201 for (int i = 0; i < _dimension; i++) { 202 V._elements[i] = _elements[i].plus(T._elements[i]); 203 } 204 return V; 205 } 206 207 @SuppressWarnings ("unchecked") 208 @Override 209 public MeasureVector<? extends Quantity> times(Measure k) { 210 MeasureVector V = MeasureVector.newInstance(_dimension); 211 for (int i = 0; i < _dimension; i++) { 212 V._elements[i] = _elements[i].times(k); 213 } 214 return V; 215 } 216 217 @Override 218 public Measure<?> times(Vector<Measure<?>> that) { 219 MeasureVector<? extends Quantity> T = MeasureVector.valueOf(that.get(0).getUnit(), that); 220 if (T._dimension != _dimension) throw new DimensionException(); 221 PoolContext.enter(); 222 try { 223 Measure<?> sum = (Measure<?>) _elements[0].times(T._elements[0]); 224 for (int i = 1; i < _dimension; i++) { 225 sum = sum.plus(_elements[i].times(T._elements[i])); 226 } 227 sum.move(ObjectSpace.OUTER); 228 return sum; 229 } finally { 230 PoolContext.exit(); 231 } 232 } 233 234 238 @SuppressWarnings ("unchecked") 239 static <Q extends Quantity> MeasureVector<Q> newInstance(final int dimension) { 240 final MeasureVector<Q> V = FACTORY.object(); 241 V._dimension = dimension; 242 if ((V._elements == null) || (V._elements.length < dimension)) { 243 MemoryArea.getMemoryArea(V).executeInArea(new Runnable () { 244 public void run() { 245 V._elements = new Measure[dimension]; 246 } 247 }); 248 } 249 return V; 250 } 251 252 private static Factory<MeasureVector> FACTORY = new Factory<MeasureVector>() { 253 protected MeasureVector create() { 254 return new MeasureVector(); 255 } 256 }; 257 258 private MeasureVector() { 259 } 260 261 private static final long serialVersionUID = 1L; 262 } | Popular Tags |