Java ojalgo中的稀疏矩阵分解

Java ojalgo中的稀疏矩阵分解,java,sparse-matrix,ojalgo,Java,Sparse Matrix,Ojalgo,我想用ojalgo做最小二乘平差。 问题是我的设计矩阵非常庞大(超过100kx100k),但非常稀疏。 用ojalgo建立巨大的稀疏矩阵是没有问题的。还要做一些基本的数学运算。 当我从SparseStore矩阵创建QR对象时,似乎SparseStore矩阵信息被忽略,QR对象被初始化为2D DenseMatrix对象。 当然,我的系统内存不足 是否有可能进行qr(或其他)操作以保持SparseStore 谢谢你的帮助 最好的, 罗尼 源代码: package matrixTest; import

我想用ojalgo做最小二乘平差。 问题是我的设计矩阵非常庞大(超过100kx100k),但非常稀疏。 用ojalgo建立巨大的稀疏矩阵是没有问题的。还要做一些基本的数学运算。 当我从SparseStore矩阵创建QR对象时,似乎SparseStore矩阵信息被忽略,QR对象被初始化为2D DenseMatrix对象。 当然,我的系统内存不足

是否有可能进行qr(或其他)操作以保持SparseStore

谢谢你的帮助

最好的, 罗尼

源代码:

package matrixTest;
import static org.ojalgo.type.CalendarDateUnit.*;

import java.util.Random;

import org.ojalgo.OjAlgoUtils;
import org.ojalgo.array.LongToNumberMap;
import org.ojalgo.array.Primitive64Array;
import org.ojalgo.array.SparseArray;
import org.ojalgo.matrix.decomposition.QR;
import org.ojalgo.matrix.store.MatrixStore;
import org.ojalgo.matrix.store.SparseStore;
import org.ojalgo.matrix.task.iterative.ConjugateGradientSolver;
import org.ojalgo.netio.BasicLogger;
import org.ojalgo.series.BasicSeries;
import org.ojalgo.type.Stopwatch;

/**
 * Example use of SparseStore and other special MatrixStore implementations.
 *
 * @see https://www.ojalgo.org/2020/09/sparse-and-special-structure-matrices/
 * @see https://github.com/optimatika/ojAlgo/wiki/Sparse-Matrices
 */
public class SparseMatrices {

    private static String NON_ZEROS = "{} non-zeroes out of {} matrix elements calculated in {}";
    private static Random RANDOM = new Random();

    public static void main(final String[] args) {

        BasicLogger.debug();
        BasicLogger.debug(SparseMatrices.class);
        BasicLogger.debug(OjAlgoUtils.getTitle());
        BasicLogger.debug(OjAlgoUtils.getDate());
        BasicLogger.debug();

        int dim = 100_000;

        SparseStore<Double> mtrxD = SparseStore.PRIMITIVE64.make(dim, dim);

        for (int j = 0; j < dim; j++) {
            double val = RANDOM.nextDouble();
            mtrxD.set(j, j, val);
        } // Each column of B contains 1 non-zero element at random row

        QR<Double> decompQR = QR.PRIMITIVE.make(mtrxD);

        
        stopwatch.reset();
        decompQR.compute(mtrxD);
        BasicLogger.debug("Sparse Identity decomposed (QR) in {}", stopwatch.stop());

    }

}
packagematrixtest;
导入静态org.ojalgo.type.CalendarDateUnit.*;
导入java.util.Random;
导入org.ojalgo.ojalgutils;
导入org.ojalgo.array.LongToNumberMap;
导入org.ojalgo.array.Primitive64Array;
导入org.ojalgo.array.SparseArray;
导入org.ojalgo.matrix.decomposition.QR;
导入org.ojalgo.matrix.store.MatrixStore;
导入org.ojalgo.matrix.store.SparseStore;
导入org.ojalgo.matrix.task.iterative.ConjugateGradientSolver;
导入org.ojalgo.netio.basiclugger;
导入org.ojalgo.series.BasicSeries;
导入org.ojalgo.type.Stopwatch;
/**
*SparseStore和其他特殊MatrixStore实现的示例使用。
*
*@见https://www.ojalgo.org/2020/09/sparse-and-special-structure-matrices/
*@见https://github.com/optimatika/ojAlgo/wiki/Sparse-Matrices
*/
公共类稀疏矩阵{
私有静态字符串NON_ZEROS=“{}中计算的{}矩阵元素中的{}非零”;
私有静态随机=新随机();
公共静态void main(最终字符串[]args){
basiclocker.debug();
调试(SparseMatrices.class);
debug(OjAlgoUtils.getTitle());
调试(OjAlgoUtils.getDate());
basiclocker.debug();
int dim=100_000;
SparseStore mtrxD=SparseStore.PRIMITIVE64.make(变暗,变暗);
对于(int j=0;j
目前没有保留稀疏性的矩阵分解


不知道你需要什么,也不知道ojAlgo到底有什么。你能用转置矩阵相乘,然后使用迭代解算器吗?

目前没有保持稀疏性的矩阵分解


不知道你需要什么,也不知道ojAlgo到底有什么。你能用转置矩阵相乘,然后使用迭代解算器吗?

也可以。但是我想我必须先计算矩阵的逆。据了解,这在ojAlgo或?谢谢你的回答!我想迭代解算器可以帮你解决这个问题。查看org.ojalgo.matrix.task.iterative包,org.ojalgo.optimization.convertic.IterativeASS类有一个嵌套类型MyIterativeSolver,它是稀疏实现/用法。也应该是可能的。但是我想我必须先计算矩阵的逆。据了解,这在ojAlgo或?谢谢你的回答!我想迭代解算器可以帮你解决这个问题。查看org.ojalgo.matrix.task.iterative包,org.ojalgo.optimization.convertic.IterativeASS类有一个嵌套类型MyIterativeSolver,它是稀疏实现/用法。