/* * Copyright 2011-2014, by Vladimir Kostyukov and Contributors. * * This file is part of la4j project (http://la4j.org) * * Licensed under the Apache License, Version 2.0 (the "License"); * You may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Contributor(s): - * */ package org.la4j.vector; import org.la4j.Matrix; import org.la4j.Vectors; import org.la4j.matrix.dense.Basic2DMatrix; import org.la4j.Vector; import org.la4j.operation.VectorMatrixOperation; import org.la4j.operation.VectorOperation; import org.la4j.operation.VectorVectorOperation; import org.la4j.vector.dense.BasicVector; import java.text.NumberFormat; import java.util.Collection; import java.util.Map; import java.util.Random; /** * A dense vector. * * A vector represents an array of elements. It can be re-sized. * * A dense data structure usually stores data in an underlying array. Zero elements * take up memory space. If you want a data structure that will not have zero * elements take up memory space, try a sparse structure. * * However, fetch/store operations on dense data structures only take O(1) time, * instead of the O(log n) time on sparse structures. * */ public abstract class DenseVector extends Vector { public DenseVector(int length) { super(length); } /** * Creates a zero {@link DenseVector} of the given {@code length}. */ public static DenseVector zero(int length) { return BasicVector.zero(length); } /** * Creates a constant {@link DenseVector} of the given {@code length} with * the given {@code value}. */ public static DenseVector constant(int length, double value) { return BasicVector.constant(length, value); } /** * Creates an unit {@link DenseVector} of the given {@code length}. */ public static DenseVector unit(int length) { return DenseVector.constant(length, 1.0); } /** * Creates a random {@link DenseVector} of the given {@code length} with * the given {@code Random}. */ public static DenseVector random(int length, Random random) { return BasicVector.random(length, random); } /** * Creates a new {@link DenseVector} from the given {@code array} w/o * copying the underlying array. */ public static DenseVector fromArray(double[] array) { return BasicVector.fromArray(array); } /** * Parses {@link DenseVector} from the given CSV string. * * @param csv the CSV string representing a vector * * @return a parsed vector */ public static DenseVector fromCSV(String csv) { return Vector.fromCSV(csv).to(Vectors.DENSE); } /** * Parses {@link DenseVector} from the given Matrix Market string. * * @param mm the string in Matrix Market format * * @return a parsed vector */ public static DenseVector fromMatrixMarket(String mm) { return Vector.fromMatrixMarket(mm).to(Vectors.DENSE); } /** * Creates new {@link org.la4j.vector.DenseVector} from * * @param list list containing doubles * * @return new vector from given double list */ public static DenseVector fromCollection(Collection<? extends Number> list) { return BasicVector.fromCollection(list); } /** * Creates new {@link DenseVector} from index-value map * * @param map index-value map * * @param length vector length * * @return created vector */ public static DenseVector fromMap(Map<Integer, ? extends Number> map, int length) { return Vector.fromMap(map, length).to(Vectors.DENSE); } @Override public <T> T apply(VectorOperation<T> operation) { operation.ensureApplicableTo(this); return operation.apply(this); } @Override public <T> T apply(VectorVectorOperation<T> operation, Vector that) { return that.apply(operation.partiallyApply(this)); } @Override public <T> T apply(VectorMatrixOperation<T> operation, Matrix that) { return that.apply(operation.partiallyApply(this)); } /** * Converts this dense vector to a double array. * * @return an array representation of this vector */ public abstract double[] toArray(); @Override public Matrix toRowMatrix() { Matrix result = Basic2DMatrix.zero(1, length); for (int j = 0; j < length; j++) { result.set(0, j, get(j)); } return result; } @Override public Matrix toColumnMatrix() { Matrix result = Basic2DMatrix.zero(length, 1); for (int i = 0; i < length; i++) { result.set(i, 0, get(i)); } return result; } @Override public Matrix toDiagonalMatrix() { Matrix result = Basic2DMatrix.zero(length, length); for (int i = 0; i < length; i++) { result.set(i, i, get(i)); } return result; } @Override public String toMatrixMarket(NumberFormat formatter) { StringBuilder out = new StringBuilder(); out.append("%%MatrixMarket vector array real\n"); out.append(length).append('\n'); for (int i = 0; i < length; i++) { out.append(formatter.format(get(i))).append('\n'); } return out.toString(); } }