package edu.fudan.ontology.graph;
import gnu.trove.iterator.TLongObjectIterator;
import gnu.trove.map.hash.TLongObjectHashMap;
/**
* 两维稀疏矩阵
* 列向量优先
* @author xpqiu
* @version 1.0
* SparseMatrix
* package edu.fudan.ml.types
*/
public class SparseMatrix<T> {
/**
* 每一维的大小
*/
private int dim1;
private int dim2;
/**
* 内部为向量表示
*/
public TLongObjectHashMap<T> vector = null;
public SparseMatrix(){
vector = new TLongObjectHashMap<T>(100,0.8f);
}
public SparseMatrix(int dim){
this();
this.dim1 = dim;
this.dim2 = dim;
}
public void set(int x, int y, T val){
long idx = getIdx(x,y);
if(idx==-1)
return;
set(idx,val);
}
public void set(long index, T value) {
vector.put(index, value);
}
public T get(int[] indices) {
long idx = getIdx(indices[0],indices[1]);
return vector.get(idx);
}
public T get(int id1, int id2) {
long idx = getIdx(id1,id2);
return vector.get(idx);
}
public T elementAt(long index) {
return vector.get(index);
}
public int[] size() {
return new int[]{dim1,dim2};
}
public int NZN() {
return vector.size();
}
public long[] getKeyIdx() {
return vector.keys();
}
/**
* 将多维索引转换为列排序索引
* @param indices
* @return
* Jul 29, 2009
*/
public long getIdx(int x,int y){
long idx=-1;
if(x>=0&&x<dim1&&y>=0&&y<dim2)
idx = dim1*x+y;
return idx;
}
/**
* long型索引转换为int[]索引
* @param idx
* @return 索引
*/
public int[] getIndices(long idx)
{
int xIndices = (int)idx%dim1;
int yIndices = (int)(idx-xIndices)/dim1;
int []Indices = {xIndices,yIndices};
return Indices;
}
public SparseMatrix<T> resize(int dim){
SparseMatrix<T> mat = new SparseMatrix<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[0],idx[1], val);
}
return mat;
}
}