package edu.fudan.ontology.graph;
import gnu.trove.iterator.TLongObjectIterator;
import gnu.trove.map.hash.TLongObjectHashMap;
/**
* 类似于matlab的多维稀疏矩阵
* 列向量优先
* @author xpqiu
* @version 1.0
* SparseMatrix
* package edu.fudan.ml.types
*/
public class SparseMatrixT<T> {
/**
* 每一维的大小
*/
private int[] dim;
/**
* 内部为向量表示
*/
public TLongObjectHashMap<T> vector = null;
public SparseMatrixT(){
vector = new TLongObjectHashMap<T>(100,0.8f);
}
public SparseMatrixT(int[] dim){
this();
this.dim = dim;
}
public void set(int[] indices, T val){
long idx = getIdx(indices);
set(idx,val);
}
public void set(long index, T value) {
vector.put(index, value);
}
public T elementAt(int[] indices) {
long idx = getIdx(indices);
return vector.get(idx);
}
public T elementAt(long index) {
return vector.get(index);
}
public int[] size() {
return dim;
}
/**
* 将多维索引转换为列排序索引
* @param indices
* @return
* Jul 29, 2009
*/
public long getIdx(int[] indices){
long idx=0;
int i=indices.length-1;
for(int j=0;i>0&&j<indices.length-1;i--,j++)
idx += indices[i]*dim[j];
idx += indices[0];
return idx;
}
/**
* long型索引转换为int[]索引
* @param idx
* @return 索引
*/
public int[] getIndices(long idx)
{
int xIndices = (int)idx%this.size()[0];
int yIndices = (int)(idx-xIndices)/this.size()[0];
int []Indices = {xIndices,yIndices};
return Indices;
}
public SparseMatrixT<T> clone(){
SparseMatrixT<T> mat = new SparseMatrixT<T>();
mat.dim = this.dim;
mat.vector = new TLongObjectHashMap<T>(vector);
return mat;
}
public SparseMatrixT<T> resize(int[] dim){
SparseMatrixT<T> mat = new SparseMatrixT<T>(dim);
TLongObjectIterator<T> it = vector.iterator();
while(it.hasNext()){
it.advance();
long key = it.key();
T val = it.value();
int[] idx = getIndices(key);
mat.set(idx, val);
}
return mat;
}
}