/** * Optimized method to add sparse vectors. * @param v vector to add * @return The sum of <code>this</code> and <code>v</code> * @throws IllegalArgumentException If the dimensions don't match */ public FieldVector<T> add(SparseFieldVector<T> v) throws IllegalArgumentException { checkVectorDimensions(v.getDimension()); SparseFieldVector<T> res = (SparseFieldVector<T>)copy(); OpenIntToFieldHashMap<T>.Iterator iter = v.getEntries().iterator(); while (iter.hasNext()) { iter.advance(); int key = iter.key(); T value = iter.value(); if (entries.containsKey(key)) { res.setEntry(key, entries.get(key).add(value)); } else { res.setEntry(key, value); } } return res; }
/** * Optimized method to subtract SparseRealVectors. * @param v The vector to subtract from <code>this</code> * @return The difference of <code>this</code> and <code>v</code> * @throws IllegalArgumentException If the dimensions don't match */ public SparseFieldVector<T> subtract(SparseFieldVector<T> v) throws IllegalArgumentException{ checkVectorDimensions(v.getDimension()); SparseFieldVector<T> res = (SparseFieldVector<T>)copy(); OpenIntToFieldHashMap<T>.Iterator iter = v.getEntries().iterator(); while (iter.hasNext()) { iter.advance(); int key = iter.key(); if (entries.containsKey(key)) { res.setEntry(key, entries.get(key).subtract(iter.value())); } else { res.setEntry(key, field.getZero().subtract(iter.value())); } } return res; }
/** * Optimized method to compute outer product when both vectors are sparse. * @param v vector with which outer product should be computed * @return the square matrix outer product between instance and v * @throws IllegalArgumentException if v is not the same size as {@code this} */ public FieldMatrix<T> outerProduct(SparseFieldVector<T> v) throws IllegalArgumentException { checkVectorDimensions(v.getDimension()); SparseFieldMatrix<T> res = new SparseFieldMatrix<T>(field, virtualSize, virtualSize); OpenIntToFieldHashMap<T>.Iterator iter = entries.iterator(); while (iter.hasNext()) { iter.advance(); OpenIntToFieldHashMap<T>.Iterator iter2 = v.entries.iterator(); while (iter2.hasNext()) { iter2.advance(); res.setEntry(iter.key(), iter2.key(), iter.value().multiply(iter2.value())); } } return res; }
/** * Optimized method to add sparse vectors. * @param v vector to add * @return The sum of <code>this</code> and <code>v</code> * @throws IllegalArgumentException If the dimensions don't match */ public FieldVector<T> add(SparseFieldVector<T> v) throws IllegalArgumentException { checkVectorDimensions(v.getDimension()); SparseFieldVector<T> res = (SparseFieldVector<T>)copy(); OpenIntToFieldHashMap<T>.Iterator iter = v.getEntries().iterator(); while (iter.hasNext()) { iter.advance(); int key = iter.key(); T value = iter.value(); if (entries.containsKey(key)) { res.setEntry(key, entries.get(key).add(value)); } else { res.setEntry(key, value); } } return res; }
/** {@inheritDoc} */ public FieldVector<T> getSubVector(int index, int n) throws MatrixIndexException { checkIndex(index); checkIndex(index + n - 1); SparseFieldVector<T> res = new SparseFieldVector<T>(field,n); int end = index + n; OpenIntToFieldHashMap<T>.Iterator iter = entries.iterator(); while (iter.hasNext()) { iter.advance(); int key = iter.key(); if (key >= index && key < end) { res.setEntry(key - index, iter.value()); } } return res; }
/** * Optimized method to subtract SparseRealVectors. * @param v The vector to subtract from <code>this</code> * @return The difference of <code>this</code> and <code>v</code> * @throws IllegalArgumentException If the dimensions don't match */ public SparseFieldVector<T> subtract(SparseFieldVector<T> v) throws IllegalArgumentException{ checkVectorDimensions(v.getDimension()); SparseFieldVector<T> res = (SparseFieldVector<T>)copy(); OpenIntToFieldHashMap<T>.Iterator iter = v.getEntries().iterator(); while (iter.hasNext()) { iter.advance(); int key = iter.key(); if (entries.containsKey(key)) { res.setEntry(key, entries.get(key).subtract(iter.value())); } else { res.setEntry(key, field.getZero().subtract(iter.value())); } } return res; }
/** * Optimized method to compute outer product when both vectors are sparse. * @param v vector with which outer product should be computed * @return the square matrix outer product between instance and v * @throws IllegalArgumentException if v is not the same size as {@code this} */ public FieldMatrix<T> outerProduct(SparseFieldVector<T> v) throws IllegalArgumentException { checkVectorDimensions(v.getDimension()); SparseFieldMatrix<T> res = new SparseFieldMatrix<T>(field, virtualSize, virtualSize); OpenIntToFieldHashMap<T>.Iterator iter = entries.iterator(); while (iter.hasNext()) { iter.advance(); OpenIntToFieldHashMap<T>.Iterator iter2 = v.entries.iterator(); while (iter2.hasNext()) { iter2.advance(); res.setEntry(iter.key(), iter2.key(), iter.value().multiply(iter2.value())); } } return res; }
/** {@inheritDoc} */ public FieldVector<T> getSubVector(int index, int n) throws MatrixIndexException { checkIndex(index); checkIndex(index + n - 1); SparseFieldVector<T> res = new SparseFieldVector<T>(field,n); int end = index + n; OpenIntToFieldHashMap<T>.Iterator iter = entries.iterator(); while (iter.hasNext()) { iter.advance(); int key = iter.key(); if (key >= index && key < end) { res.setEntry(key - index, iter.value()); } } return res; }
/** {@inheritDoc} */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((field == null) ? 0 : field.hashCode()); result = prime * result + virtualSize; OpenIntToFieldHashMap<T>.Iterator iter = entries.iterator(); while (iter.hasNext()) { iter.advance(); int temp = iter.value().hashCode(); result = prime * result + temp; } return result; }
/** {@inheritDoc} */ public FieldMatrix<T> outerProduct(T[] v) throws IllegalArgumentException { checkVectorDimensions(v.length); FieldMatrix<T> res = new SparseFieldMatrix<T>(field, virtualSize, virtualSize); OpenIntToFieldHashMap<T>.Iterator iter = entries.iterator(); while (iter.hasNext()) { iter.advance(); int row = iter.key(); FieldElement<T>value = iter.value(); for (int col = 0; col < virtualSize; col++) { res.setEntry(row, col, value.multiply(v[col])); } } return res; }
/** {@inheritDoc} */ public T dotProduct(T[] v) throws IllegalArgumentException { checkVectorDimensions(v.length); T res = field.getZero(); OpenIntToFieldHashMap<T>.Iterator iter = entries.iterator(); while (iter.hasNext()) { int idx = iter.key(); T value = field.getZero(); if (idx < v.length) { value = v[idx]; } res = res.add(value.multiply(iter.value())); } return res; }
/** * Construct a vector by appending a vector to this vector. * @param v vector to append to this one. * @return a new vector */ public FieldVector<T> append(SparseFieldVector<T> v) { SparseFieldVector<T> res = new SparseFieldVector<T>(this, v.getDimension()); OpenIntToFieldHashMap<T>.Iterator iter = v.entries.iterator(); while (iter.hasNext()) { iter.advance(); res.setEntry(iter.key() + virtualSize, iter.value()); } return res; }
/** {@inheritDoc} */ public FieldMatrix<T> outerProduct(T[] v) throws IllegalArgumentException { checkVectorDimensions(v.length); FieldMatrix<T> res = new SparseFieldMatrix<T>(field, virtualSize, virtualSize); OpenIntToFieldHashMap<T>.Iterator iter = entries.iterator(); while (iter.hasNext()) { iter.advance(); int row = iter.key(); FieldElement<T>value = iter.value(); for (int col = 0; col < virtualSize; col++) { res.setEntry(row, col, value.multiply(v[col])); } } return res; }
/** {@inheritDoc} */ public T dotProduct(T[] v) throws IllegalArgumentException { checkVectorDimensions(v.length); T res = field.getZero(); OpenIntToFieldHashMap<T>.Iterator iter = entries.iterator(); while (iter.hasNext()) { int idx = iter.key(); T value = field.getZero(); if (idx < v.length) { value = v[idx]; } res = res.add(value.multiply(iter.value())); } return res; }
/** {@inheritDoc} */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((field == null) ? 0 : field.hashCode()); result = prime * result + virtualSize; OpenIntToFieldHashMap<T>.Iterator iter = entries.iterator(); while (iter.hasNext()) { iter.advance(); int temp = iter.value().hashCode(); result = prime * result + temp; } return result; }
/** * Construct a vector by appending a vector to this vector. * @param v vector to append to this one. * @return a new vector */ public FieldVector<T> append(SparseFieldVector<T> v) { SparseFieldVector<T> res = new SparseFieldVector<T>(this, v.getDimension()); OpenIntToFieldHashMap<T>.Iterator iter = v.entries.iterator(); while (iter.hasNext()) { iter.advance(); res.setEntry(iter.key() + virtualSize, iter.value()); } return res; }