Как мне создать 2D массивы на основе параметров матрицы разреженных столбцов в JAVA - PullRequest
1 голос
/ 21 мая 2019

Я новичок в 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, indptr, data и shape 1D, как показано выше.Я ожидаю, что смогу создать следующие 2D массивы:

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

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Я наконец-то нашел то, что мне нужно, библиотека Java la4j .Сначала добавьте зависимости:

<dependency>
  <groupId>org.la4j</groupId>
  <artifactId>la4j</artifactId>
  <version>0.6.0</version>
</dependency>

Затем я могу создать CCSMatrix martix и преобразовать матрицу в двумерные массивы.

import java.io.IOException;
import org.la4j.matrix.sparse.CCSMatrix;

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};
        double[] data = new int[]{1, 2, 3, 4, 5, 6};
        int[] shape = new int[]{3,3};
        // some code to create 2D arrays
        CCSMatrix a = new CCSMatrix(shape[0],shape[1],data.length,data,indices,indptr);
        double[][] mat = a.toDenseMatrix().toArray();
    }
}
1 голос
/ 21 мая 2019

Я сомневаюсь, что есть какой-либо стандартный метод для этого. Если вы хотите использовать выделенные классы, то, вероятно, некоторые Math-библиотеки с разреженными матрицами предоставят такие конструкторы. Если вам нужен 2D-массив, вы можете легко реализовать такой код самостоятельно. Если вам нужна такая подпись, вот простой метод:

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;
}
...