public Vector logNormalize(double power, double normLength) { // we can special case certain powers if (Double.isInfinite(power) || power <= 1.0) { throw new IllegalArgumentException("Power must be > 1 and < infinity"); } else { double denominator = normLength * Math.log(power); Vector result = createOptimizedCopy(); for (Element element : result.nonZeroes()) { element.set(Math.log1p(element.get()) / denominator); } return result; } }
xe.set(f.apply(xe.get(), ye.get())); advanceThis = true; advanceThat = true;
@Override public Vector assign(DoubleDoubleFunction f, double y) { Iterator<Element> iterator = f.apply(0, y) == 0 ? iterateNonZero() : iterator(); while (iterator.hasNext()) { Element element = iterator.next(); element.set(f.apply(element.get(), y)); } invalidateCachedLength(); return this; }
@Override public void set(double value) { decorated.set(value); } }
Element e = it.next(); if (e.index() == 5) { e.set(0.0);
e.set(e.get() - 5.0); i++; if (i == v.getNumNondefaultElements() - 1) { e.set(e.get() - 5.0); assertEquals("mutation via assign(double[]) fails to change lengthSquared", expected, v.getLengthSquared(), EPSILON); v.getElement(v.size()/2).set(2.5); expected = lengthSquaredSlowly(v); assertEquals("mutation via v.getElement().set() fails to change lengthSquared", expected, v.getLengthSquared(), EPSILON);
@Override public Vector assign(double[] values) { if (size != values.length) { throw new CardinalityException(size, values.length); } if (isSequentialAccess() && !isAddConstantTime()) { OrderedIntDoubleMapping updates = new OrderedIntDoubleMapping(); Iterator<Element> it = iterator(); while (it.hasNext()) { Element element = it.next(); int index = element.index(); if (element.get() == 0.0) { updates.set(index, values[index]); } else { element.set(values[index]); } } mergeUpdates(updates); } else { for (int i = 0; i < size; ++i) { setQuick(i, values[i]); } } invalidateCachedLength(); return this; }
@Test public void testEigen() { double[] evals = {0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 2.0e-7, 0.0, 0.0, -2.0e-7, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0}; int i = 0; Matrix a = new DenseMatrix(4, 4); for (MatrixSlice row : a) { for (Vector.Element element : row.vector().all()) { element.set(evals[i++]); } } EigenDecomposition eig = new EigenDecomposition(a); Matrix d = eig.getD(); Matrix v = eig.getV(); check("EigenvalueDecomposition (nonsymmetric)...", a.times(v), v.times(d)); }
@Test public void testSequential() { int validld = 3; Matrix A = new DenseMatrix(validld, validld); double[] columnwise = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0}; int i = 0; for (MatrixSlice row : A) { for (Vector.Element element : row.vector().all()) { element.set(columnwise[i++]); } } EigenDecomposition Eig = new EigenDecomposition(A); Matrix D = Eig.getD(); Matrix V = Eig.getV(); check("EigenvalueDecomposition (nonsymmetric)...", A.times(V), V.times(D)); A = A.transpose().times(A); Eig = new EigenDecomposition(A); D = Eig.getD(); V = Eig.getV(); check("EigenvalueDecomposition (symmetric)...", A.times(V), V.times(D)); }
@Override public Vector assign(Vector x, Vector y, DoubleDoubleFunction f) { OpenIntHashSet visited = new OpenIntHashSet(); for (Element xe : x.nonZeroes()) { xe.set(f.apply(xe.get(), y.getQuick(xe.index()))); visited.add(xe.index()); } OrderedIntDoubleMapping updates = new OrderedIntDoubleMapping(false); for (Element ye : y.nonZeroes()) { if (!visited.contains(ye.index())) { updates.set(ye.index(), f.apply(x.getQuick(ye.index()), ye.get())); } } x.mergeUpdates(updates); return x; } }
@Override public Vector assign(Vector x, Vector y, DoubleDoubleFunction f) { OpenIntHashSet visited = new OpenIntHashSet(); for (Element xe : x.nonZeroes()) { xe.set(f.apply(xe.get(), y.getQuick(xe.index()))); visited.add(xe.index()); } for (Element ye : y.nonZeroes()) { if (!visited.contains(ye.index())) { x.setQuick(ye.index(), f.apply(x.getQuick(ye.index()), ye.get())); } } return x; } }
@Test public void testIteratorSet() { Vector clone = test.clone(); for (Element e : clone.nonZeroes()) { e.set(e.get() * 2.0); } for (Element e : clone.nonZeroes()) { assertEquals(test.get(e.index()) * 2.0, e.get(), EPSILON); } clone = test.clone(); for (Element e : clone.all()) { e.set(e.get() * 2.0); } for (Element e : clone.all()) { assertEquals(test.get(e.index()) * 2.0, e.get(), EPSILON); } }
public void createRandom(Vector v) { int size = randomInt(v.size() - 1); for (int i = 0; i < size; ++i) { v.set(randomInt(v.size() - 1), randomDouble()); } int zeros = Math.max(2, size / 4); for (Element e : v.nonZeroes()) { if (e.index() % zeros == 0) { e.set(0.0); } } }
@Override public Vector assign(Vector x, Vector y, DoubleDoubleFunction f) { for (Element xe : x.nonZeroes()) { xe.set(f.apply(xe.get(), y.getQuick(xe.index()))); } return x; } }
@Override public Vector assign(DoubleFunction f) { Iterator<Element> iterator = !f.isDensifying() ? iterateNonZero() : iterator(); while (iterator.hasNext()) { Element element = iterator.next(); element.set(f.apply(element.get())); } invalidateCachedLength(); return this; }
@Override public void set(double value) { decorated.set(value); } }
@Override public Vector divide(double x) { if (x == 1.0) { return clone(); } Vector result = createOptimizedCopy(); for (Element element : result.nonZeroes()) { element.set(element.get() / x); } return result; }