@Override public int[] columnIndices() { return fromUpTo(0, getColumnCount(), 1); }
/** * Reads a sparse matrix from the given input stream. * * @param in the input stream. * @return a new sparse matrix from the stream. * @throws IOException in case of an IO error. */ public static SparseDoubleRowMatrix readSparseMatrix(DataInput in) throws IOException { SparseDoubleRowMatrix mat = new SparseDoubleRowMatrix(in.readInt(), in.readInt()); final int numRowIndices = in.readInt(); for (int i = 0; i < numRowIndices; i++) { final int rowIndex = in.readInt(); final int numColumns = in.readInt(); DoubleVector row = new SparseDoubleVector(mat.getColumnCount()); for (int j = 0; j < numColumns; j++) { row.set(in.readInt(), in.readDouble()); } mat.setRowVector(rowIndex, row); } return mat; }
@Override public DoubleVector getRowVector(int row) { SparseDoubleVector v = matrix.get(row); if (v == null) { v = new SparseDoubleVector(getColumnCount()); matrix.put(row, v); } return v; }
throws IOException { out.writeInt(mat.getRowCount()); out.writeInt(mat.getColumnCount()); int[] rowIndices = mat.rowIndices(); out.writeInt(rowIndices.length);
@Override public double[][] toArray() { int[] rowIndices = rowIndices(); double[][] dim = new double[getRowCount()][getColumnCount()]; for (int row : rowIndices) { DoubleVector rowVector = getRowVector(row); Iterator<DoubleVectorElement> iterateNonZero = rowVector.iterateNonZero(); while (iterateNonZero.hasNext()) { DoubleVectorElement next = iterateNonZero.next(); dim[row][next.getIndex()] = next.getValue(); } } return dim; }
@Override public void set(int row, int col, double value) { if (value != 0.0d) { SparseDoubleVector sparseDoubleVector = matrix.get(row); if (sparseDoubleVector == null) { sparseDoubleVector = new SparseDoubleVector(getColumnCount()); matrix.put(row, sparseDoubleVector); } sparseDoubleVector.set(col, value); } }
@Override public DoubleMatrix subtract(double amount) { DoubleMatrix result = new SparseDoubleRowMatrix(this.getRowCount(), this.getColumnCount()); for (int row : this.matrix.keys()) { Iterator<DoubleVectorElement> iterate = matrix.get(row).iterate(); while (iterate.hasNext()) { DoubleVectorElement e = iterate.next(); result.set(row, e.getIndex(), e.getValue() - amount); } } return result; }
@Override public DoubleMatrix subtractBy(double amount) { DoubleMatrix result = new SparseDoubleRowMatrix(this.getRowCount(), this.getColumnCount()); for (int row : this.matrix.keys()) { Iterator<DoubleVectorElement> iterate = matrix.get(row).iterate(); while (iterate.hasNext()) { DoubleVectorElement e = iterate.next(); result.set(row, e.getIndex(), amount - e.getValue()); } } return result; }
@Override public DoubleMatrix divide(double scalar) { DoubleMatrix result = new SparseDoubleRowMatrix(this.getRowCount(), this.getColumnCount()); for (int row : this.matrix.keys()) { Iterator<DoubleVectorElement> iterateNonZero = matrix.get(row) .iterateNonZero(); while (iterateNonZero.hasNext()) { DoubleVectorElement e = iterateNonZero.next(); result.set(row, e.getIndex(), e.getValue() / scalar); } } return result; }
@Override public DoubleMatrix divide(DoubleVector vec) { DoubleMatrix result = new SparseDoubleRowMatrix(this.getRowCount(), this.getColumnCount()); for (int row : this.matrix.keys()) { SparseDoubleVector rowVector = matrix.get(row); Iterator<DoubleVectorElement> iterateNonZero = rowVector.iterateNonZero(); while (iterateNonZero.hasNext()) { DoubleVectorElement next = iterateNonZero.next(); result.set(row, next.getIndex(), next.getValue() / vec.get(row)); } } return result; }
@Override public DoubleMatrix multiplyElementWise(DoubleMatrix other) { DoubleMatrix result = new SparseDoubleRowMatrix(this.getRowCount(), this.getColumnCount()); for (int row : this.matrix.keys()) { Iterator<DoubleVectorElement> iterateNonZero = matrix.get(row) .iterateNonZero(); while (iterateNonZero.hasNext()) { DoubleVectorElement e = iterateNonZero.next(); result.set(row, e.getIndex(), get(row, e.getIndex()) * other.get(row, e.getIndex())); } } return result; }
@Override public DoubleMatrix subtract(DoubleVector vec) { DoubleMatrix result = new SparseDoubleRowMatrix(this.getRowCount(), this.getColumnCount()); for (int row : this.matrix.keys()) { SparseDoubleVector rowVec = matrix.get(row); result.setRowVector(row, rowVec.subtract(vec.get(row))); } return result; }
@Override public DoubleMatrix pow(double x) { DoubleMatrix result = new SparseDoubleRowMatrix(this.getRowCount(), this.getColumnCount()); for (int row : this.matrix.keys()) { Iterator<DoubleVectorElement> iterateNonZero = matrix.get(row) .iterateNonZero(); while (iterateNonZero.hasNext()) { DoubleVectorElement e = iterateNonZero.next(); if (x != 2d) { result.set(row, e.getIndex(), Math.pow(get(row, e.getIndex()), x)); } else { double res = get(row, e.getIndex()); result.set(row, e.getIndex(), res * res); } } } return result; }
@Override public DoubleVector multiplyVectorColumn(DoubleVector v) { DoubleVector result = new SparseDoubleVector(this.getColumnCount()); if (v.isSparse()) { Iterator<DoubleVectorElement> vectorNonZero = v.iterateNonZero(); while (vectorNonZero.hasNext()) { DoubleVectorElement featureElement = vectorNonZero.next(); DoubleVector rowVector = getRowVector(featureElement.getIndex()); Iterator<DoubleVectorElement> rowNonZero = rowVector.iterateNonZero(); while (rowNonZero.hasNext()) { DoubleVectorElement outcomeElement = rowNonZero.next(); result.set( outcomeElement.getIndex(), result.get(outcomeElement.getIndex()) + (outcomeElement.getValue() * featureElement.getValue())); } } } else { for (int row : rowIndices()) { Iterator<DoubleVectorElement> iterateNonZero = matrix.get(row) .iterateNonZero(); while (iterateNonZero.hasNext()) { DoubleVectorElement e = iterateNonZero.next(); result.set(e.getIndex(), (e.getValue() * v.get(row)) + result.get(e.getIndex())); } } } return result; }