package mikera.matrixx.impl;
import mikera.matrixx.AMatrix;
import mikera.matrixx.Matrix;
import mikera.vectorz.AVector;
import mikera.vectorz.Op;
import mikera.vectorz.Vector;
import mikera.vectorz.Vectorz;
import mikera.vectorz.impl.RepeatedElementVector;
import mikera.vectorz.util.DoubleArrays;
import mikera.vectorz.util.VectorzException;
/**
* Abstract base class for matrices that store sparse rows or columns.
*
* @author Mike
*
*/
public abstract class ASparseRCMatrix extends ARectangularMatrix {
private static final long serialVersionUID = -4153075712517555814L;
protected final AVector[] data;
protected ASparseRCMatrix(int rows, int cols, AVector[] data) {
super(rows, cols);
this.data=data;
}
protected void unsafeSetVec(int i, AVector vec) {
data[i] = vec;
}
/**
* Gets a vector from the internal data array
*
* The vector may be null (indicating a zero row or column)
*
*/
public AVector unsafeGetVector(int i) {
return data[i];
}
@Override
public boolean isSparse() {
return true;
}
@Override
public void fill(double value) {
RepeatedElementVector v=RepeatedElementVector.create(lineLength(), value);
long n=componentCount();
for (int i = 0; i < n; i++) {
unsafeSetVec(i, v);
}
}
@Override
public void reciprocal() {
AVector rr=RepeatedElementVector.create(lineLength(), 1.0/0.0);
long n=componentCount();
for (int i=0; iresult) result=v;
}
return result;
}
@Override
public void applyOp(Op op) {
boolean stoch = op.isStochastic();
AVector rr = (stoch) ? null : Vectorz.createRepeatedElement(lineLength(), op.apply(0.0));
long n=componentCount();
for (int i = 0; i < n; i++) {
AVector v = unsafeGetVector(i);
if (v == null) {
if (!stoch) {
unsafeSetVec(i, rr);
continue;
}
v = Vector.createLength(lineLength());
unsafeSetVec(i, v);
} else if (!v.isFullyMutable()) {
v = v.sparseClone();
unsafeSetVec(i, v);
}
v.applyOp(op);
}
}
@Override
public void setSparse(double value) {
long n=componentCount();
for (int i=0; i
Ads help maintain this website.