使用Java中的原始类型创建具有内部矩阵表示形式的Matrix泛型类

时间:2018-08-17 13:49:29

标签: java memory-management generic-programming primitive-types

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

3 个答案:

答案 0 :(得分:2)

您始终可以将数组包装在实现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);
}

这种方法可以扩展为仅通过在内部set类中实现Row就可以写回内部数组。扩展Matrix以允许使用get(row,col)方法很简单。

您需要为每个需要处理的原语编写一个。

答案 1 :(得分:0)

出于速度和紧凑性的考虑,我们许多人在原始类数组的顶部添加了矩阵访问器shim。例如(伪代码)

Companies

答案 2 :(得分:0)

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

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

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