我有一个2D矩阵。我的问题要求我在逻辑上将它划分为4个子矩阵。例如,如果我的原始矩阵是4 * 4,那么有4个2 * 2的子矩阵。 一个从(0,0)开始,其他是原始矩阵的(0,2),(2,0)和(2,2)索引。 我在程序期间多次访问和设置值。我想通过像matrix [x] [y] .at(row,col)这样的东西来访问子矩阵元素,其中x,y指定子矩阵号和行,col表示带有该子矩阵的元素(行,列)。 例如 matrix [2] [2] .at [0] [0] - >应该在第4个子矩阵中给出第一个元素。
非常感谢任何帮助。
先谢谢
答案 0 :(得分:1)
我不确定这里的问题是什么。基本上你只需要一个伪语义api来寻址二维矩阵的元素。您注意(假定随机)读取和写入数组。我们假设您没有处理线程问题。
Foo,Foo [] []类型的2-dim数组当然可以工作。你只需要包装它。
public class Matrix<T> {
public interface Quadrant<T> {
T get(int i, int j);
void set(T v, int i, int j);
}
public static final int XDIM = 4;
public static final int YDIM = 4;
private final Object[][] matrix = new Object[XDIM][YDIM];
public Matrix() { /* .. */ }
public Quadrant<T> quadrant(final int x, final int y) {
return new Quadrant<T> () {
@SuppressWarnings("unchecked")
@Override public final T get(int i, int j) {
return (T) matrix [x+i][y+j]; // todo: range checks, etc.
}
@Override public final void set(T v, int i, int j) {
matrix [x+i][y+j] = v; // todo: range checks, etc.
}
};
}
public static void main(String[] args) {
Matrix<Object> m = new Matrix<Object>();
m.quadrant(2, 2).set("hi there!", 0, 1);
System.out.format("{%d, %d}:(%d, %d) => %s\n", 2, 2, 0, 1, m.quadrant(2, 2).get(0, 1));
}
}
答案 1 :(得分:0)
你想要看空间填充曲线。 sfc将2d复杂度降低到1d复杂度。它可以帮助理解四叉树,也可以像四叉树一样使用它。你想看看尼克的希尔伯特曲线四叉树空间索引博客。