如何在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 显示没有声明(如下