package mikera.matrixx.impl;
import java.util.List;
import mikera.matrixx.AMatrix;
import mikera.vectorz.AVector;
import mikera.vectorz.Op;
import mikera.vectorz.impl.AMatrixViewVector;
/**
* Specialised class for viewing a matrix as a flattened vector
*
* @author Mike
*
*/
@SuppressWarnings("serial")
public class MatrixAsVector extends AMatrixViewVector {
protected final int rows;
protected final int columns;
public MatrixAsVector(AMatrix a) {
super(a,a.rowCount()*a.columnCount());
rows=a.rowCount();
columns=a.columnCount();
}
@Override
public double get(int i) {
checkIndex(i);
return source.unsafeGet(i/columns, i%columns);
}
@Override
public void set(int i, double value) {
checkIndex(i);
source.unsafeSet(i/columns, i%columns,value);
}
@Override
public double unsafeGet(int i) {
return source.unsafeGet(i/columns, i%columns);
}
@Override
public void unsafeSet(int i, double value) {
source.unsafeSet(i/columns, i%columns,value);
}
@Override
public AVector exactClone() {
return new MatrixAsVector(source.exactClone());
}
@Override
public boolean isFullyMutable() {
return source.isFullyMutable();
}
@Override
public boolean isMutable() {
return source.isMutable();
}
@Override
public boolean isView() {
return true;
}
@Override
public void set(double value) {
source.set(value);
}
@Override
public boolean isSparse() {
return source.isSparse();
}
@Override
public boolean isZero() {
return source.isZero();
}
@Override
public void getElements(double[] data, int offset) {
source.getElements(data,offset);
}
@Override
public List<Double> asElementList() {
return source.asElementList();
}
@Override
public void addToArray(double[] data, int offset) {
source.addToArray(data, offset);
}
@Override
public void clamp(double min, double max) {
source.clamp(min, max);
}
@Override
public boolean equalsArray(double[] data, int offset) {
return source.equalsArray(data, offset);
}
@Override
public double elementSum() {
return source.elementSum();
}
@Override
public double magnitudeSquared() {
return source.elementSquaredSum();
}
@Override
public void applyOp(Op op) {
source.applyOp(op);
}
@Override
public void abs() {
source.abs();
}
@Override
public void signum() {
source.signum();
}
@Override
public void negate() {
source.negate();
}
@Override
public void exp() {
source.exp();
}
@Override
public void log() {
source.log();
}
@Override
public void square() {
source.square();
}
@Override
public void sqrt() {
source.sqrt();
}
@Override
public void pow(double exponent) {
source.pow(exponent);
}
@Override
protected int calcRow(int i) {
return i/columns;
}
@Override
protected int calcCol(int i) {
return i%columns;
}
@Override
public AVector subVector(int start, int length) {
int startRow=calcRow(start);
int endRow=calcRow(start+length-1);
if (startRow==endRow) {
return source.getRowView(startRow).subVector(start-startRow*columns,length);
} else if ((startRow==endRow-1)&&(source instanceof IFastRows)) {
int split=endRow*columns;
return source.getRowView(startRow).subVector(start-startRow*columns,split-start)
.join(source.getRowView(endRow).subVector(0, start+length-split));
}
return super.subVector(start, length);
}
@Override
public double dotProduct(double[] data, int offset) {
double result=0.0;
for (int i=0; i<rows; i++) {
result+=source.getRow(i).dotProduct(data, offset+i*columns);
}
return result;
}
}