用Java表示100K X 100K矩阵

用Java表示100K X 100K矩阵,第1张

用Java表示100K X 100K矩阵

听起来您需要一个稀疏矩阵。其他人已经提出了可以满足您需求的良好的第三方实施方案。

根据您的应用程序,您可以不使用第三方矩阵库,而只需使用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实现中添加诸如乘法之类的矩阵运算应该很简单(并留给读者练习;-)



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5133748.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存