听起来您需要一个稀疏矩阵。其他人已经提出了可以满足您需求的良好的第三方实施方案。
根据您的应用程序,您可以不使用第三方矩阵库,而只需使用Map作为矩阵数据的后备存储即可。有点儿…
public class SparseMatrix<T> { private T defaultValue; private int m; private int n; private Map<Integer, T> data = new TreeMap<Integer, T>(); /// create a new matrix with m rows and n columns public SparseMatrix(int m, int n, T defaultValue) { this.m = m; this.n = n; this.defaultValue = defaultValue; } /// set value at [i,j] (row, col) public void setValueAt(int i, int j, T value) { if (i >= m || j >= n || i < 0 || j < 0) throw new IllegalArgumentException( "index (" + i + ", " +j +") out of bounds"); data.put(i * n + j, value); } /// retrieve value at [i,j] (row, col) public T getValueAt(int i, int j) { if (i >= m || j >= n || i < 0 || j < 0) throw new IllegalArgumentException( "index (" + i + ", " +j +") out of bounds"); T value = data.get(i * n + j); return value != null ? value : defaultValue; }}
一个说明SparseMatrix用法的简单测试用例为:
public class SparseMatrixTest extends TestCase { public void testMatrix() { SparseMatrix<Float> matrix = new SparseMatrix<Float>(100000, 100000, 0.0F); matrix.setValueAt(1000, 1001, 42.0F); assertTrue(matrix.getValueAt(1000,1001) == 42.0); assertTrue(matrix.getValueAt(1001,1000) == 0.0); } }
这不是最有效的方法,因为矩阵中的每个非默认条目都存储为对象。根据您期望的实际值数量,此方法的简单性可能胜过集成第三方解决方案(并可能会处理其许可-
再次取决于您的情况)。
在上面的SparseMatrix实现中添加诸如乘法之类的矩阵运算应该很简单(并留给读者练习;-)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)