使用 Java 中的基本类型创建具有内部矩阵表示的矩阵泛型 class

Create a Matrix generic class with internal matrix representation using primitive types in Java

我有一个 Matrix class 旨在封装数组的原始数组。我需要使用通用版本而不在内部使用对象来解决内存分配问题。在 Java 中有什么方法可以做到这一点吗?我可以制作一系列 if 语句来检查类型,但可能有更好的方法来做到这一点。

为了速度和紧凑性,我们中的许多人在原始数组 class 的顶部添加了一个矩阵访问器 shim。例如(伪代码)

  int data[WIDTH*HEIGHT]; // populate it
  int at(int x, int y) { return data[y*WIDTH+x]; }

您始终可以将数组包装在实现 List<List<Integer>> 的对象中,然后将其视为矩阵。

private static class Matrix extends AbstractList<List<Integer>> implements List<List<Integer>> {
    final int[][] data;

    private static class Row extends AbstractList<Integer> implements List<Integer> {
        final int[] row;

        public Row(int[] row) {
            this.row = row;
        }

        @Override
        public Integer get(int index) {
            return row[index];
        }

        @Override
        public int size() {
            return row.length;
        }
    }

    public Matrix(int[][] data) {
        this.data = data;
    }

    @Override
    public List<Integer> get(int index) {
        return new Row(data[index]);
    }

    @Override
    public int size() {
        return data.length;
    }
}

public List<List<Integer>> asMatrix(int[][] data) {
    return new Matrix(data);
}

private void test() {
    int[][] test = new int[][] {
            {1,2,3},
            {4,5,6},
            {7,8,9}
    };
    List<List<Integer>> matrix = asMatrix(test);
    System.out.println(matrix);
}

可以扩展此方法,只需在内部 Row class 中实现 set 即可写回内部数组。扩展 Matrix 以允许 get(row,col) 方法是微不足道的。

您需要为每个需要处理的基元编写其中一个。

一些现有的 Java 线性代数库对此进行了设计。要了解它在 ojAlgo 中是如何完成的,请查看 org.ojalgo.array 包中的 类:

https://github.com/optimatika/ojAlgo/blob/develop/src/org/ojalgo/array/Array2D.java

实际的线性代数类扩展或委托给数组包中的各种类。