当前位置: 首页 > 面试题库 >

用Java表示100K X 100K矩阵

刘曾琪
2023-03-14
问题内容

如何在Java中存储100K X 100K矩阵?

我无法使用普通的数组声明来执行此操作,因为它会引发java.lang.OutofMemoryError


问题答案:

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

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



 类似资料:
  • 问题内容: 我必须在Java中创建一个2D矩阵(由双精度值组成)以及一个1D向量。应该可以访问单个行和列以及单个元素。此外,它应该是线程安全的(线程同时写入)。也许以后我也需要一些矩阵运算。 哪种数据结构最适合?只是2D数组还是TreeMap?还是有什么很棒的外部库? 问题答案: 您应该将Vector用于2D数组。这是 线程安全的 。 如果这是您的矩阵索引 00 01 10 11 您可以像这样获得

  • 本文向大家介绍python用分数表示矩阵的方法实例,包括了python用分数表示矩阵的方法实例的使用技巧和注意事项,需要的朋友参考一下 前言 在机器学习中,我们会经常和矩阵打交道。在矩阵的运算中,python默认的输出是浮点数,但是如果我们想要矩阵的元素以分数的形式显示,可以通过添加一行代码来实现。 1、函数及参数解释 set_printoptions()——控制输出方式 formatter——通

  • 本文向大家介绍Python表示矩阵的方法分析,包括了Python表示矩阵的方法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python表示矩阵的方法。分享给大家供大家参考,具体如下: 在c语言中,表示个“整型3行4列”的矩阵,可以这样声明:int  a[3][4];在python中一不能声明变量int,二不能列出维数。可以利用列表中夹带列表形式表示。例如: 表示矩阵 ,可以这样:

  • 我目前正在做一个音频信号处理项目,需要在Java中的一个复杂矩阵上使用SVD。我当前的线性代数库是Apache Commons。但它只提供实矩阵的SVD,JAMA、JBLAS、EJML、ojAlgo都不支持复杂的SVD。 我一直在用一些技巧从一个等效的实矩阵中找到SVD。然而,当我重建矩阵时,这种技术对于虚部有很大的不准确性。

  • 本文向大家介绍Java实现的矩阵乘法示例,包括了Java实现的矩阵乘法示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现的矩阵乘法。分享给大家供大家参考,具体如下: 思路: 矩阵乘法的前提是:前一矩阵的行数 == 后一矩阵的列数(rows == cols) 在满足前提的情况下:前一矩阵的第一行 与 第二个矩阵的第一列 逐个相乘。将乘积求和 作为 结果矩阵的第一个元素 类推刻得

  • 本文向大家介绍C++实现图的邻接矩阵表示,包括了C++实现图的邻接矩阵表示的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C++实现图的邻接矩阵表示代码,供大家参考,具体内容如下 1.遇到的问题:教材中写着子类Graphmtx(我用GrapMatrix)继承基类Graph 但是我在子类GraphMatrix中使用父类Graph的保护成员属性:maxVertices 显示没有声明(如下