首页 > 解决方案 > 如何基于 Java 中的稀疏列矩阵参数创建二维数组?

问题描述

我是 Java 新手。我想创建一个基于压缩稀疏列矩阵参数的二维 java 数组。例如,我可以在 python 中使用以下代码创建一个二维数组:

from scipy.sparse import csc_matrix

indices = [0, 2, 2, 0, 1, 2]
indptr = [0,2,3,6]
data = [1, 2, 3, 4, 5, 6]
shape = [3,3]
sp_mat = csc_matrix((data, indices, indptr), shape=shape).todense()
print(sp_mat)
[[1 0 4]
 [0 0 5]
 [2 3 6]]

但是我不知道如何在Java中实现它。

import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        int[] indices = new int[]{0, 2, 2, 0, 1, 2};
        int[] indptr = new int[]{0, 2, 3, 6};
        int[] data = new int[]{1, 2, 3, 4, 5, 6};
        int[] shape = new int[]{3, 3};
        // some code to create 2D arrays
    }
}

我将拥有indices,和1d 数组,如上面的代码indptr。我希望能够创建以下二维数组:datashape

int[][] sp_mat = new int[][]{{1, 0, 4}, {0, 0, 5}, {2, 3, 6}};

标签: javapythonarraysscipysparse-matrix

解决方案


我怀疑是否有任何标准方法可以做到这一点。如果您想使用专用类,那么一些具有稀疏矩阵的数学库可能会提供这样的构造函数。如果您只想要二维数组,那么您可以轻松地自己实现这样的代码。如果您需要这样的签名,那么这里是简单的方法:

private static int[][] to2dArray(int[] row, int[] col, int[] data, int[] shape) {
    //check here row.length == col.length == data.length and shape.length == 2
    int[][] mat = new int[shape[0]][shape[1]];
    var length = row.length;
    for (int i = 0; i < length; i++) {
        mat[row[i]][col[i]] = data[i];
    }
    return mat;
}

后期编辑后,这里是 CSC(压缩稀疏列)版本:

private static int[][] to2dArray(
        int[] indices, int[] indicesPtr, int[] data, int[] shape) {
    int[][] mat = new int[shape[0]][shape[1]];
    for (int column = 0; column < shape[1]; column++) {
        var from = indicesPtr[column];
        var to = indicesPtr[column + 1];
        for (int index = from; index < to; index++) {
            mat[indices[index]][column] = data[index];
        }
    }
    return mat;
}

推荐阅读