使用 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
实际的线性代数类扩展或委托给数组包中的各种类。
我有一个 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
实际的线性代数类扩展或委托给数组包中的各种类。