2011-06-19 35 views
1

我有一个二维矩阵。我的问题要求我将其逻辑分成4个子矩阵。例如,如果我的原始矩阵是4 * 4,那么就有4个2 * 2的子矩阵。 一开始于(0,0)其他为(0,2),(2,0)和(2,2)原矩阵的索引。 我在程序中多次访问和设置值。我想通过类似于矩阵[x] [y] .at(row,col)的方式来访问子矩阵元素,其中x,y指定子矩阵号和行,col表示包含该矩阵的元素(行,列)。 例如 matrix [2] [2] .at [0] [0] - >应该给第4个子矩阵的第一个元素。二维矩阵的数据结构设计

任何帮助深表谢意。

在此先感谢

回答

1

我不确定这里的问题是什么。基本上你只需要一个伪语义API来寻址2维矩阵的元素。你注意到(推测是随机的)读取和写入数组。我们假设你没有处理线程问题。

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)); 
    } 
} 
+0

谢谢,这解决了我的大部分目的。我正试图再做一次改变。因为象限也是矩阵,当我们调用m.quadrant(2,2)时,有什么方法可以返回类型矩阵而不是象限。 – turbo

+0

无论如何你都可以切割和切片。例如,使矩阵成为一个接口,然后从Matrix扩展Quadrant。 – alphazero

0

你想看空间填充曲线。一个sfc将二维复杂度降低到一维复杂度。它可以帮助理解四叉树,也可以像四叉树一样使用它。你想看看Nick的希尔伯特曲线四叉树空间索引博客。

+0

我虽然会有一些简单的方法吗? – turbo

+0

也许吧,但是从2d到1d复杂度的减少值得期待,并且会大大地帮助你解决问题!但是如果你能告诉我四叉树能否帮助你解决问题,你可以快速解决你的问题吗? – Bytemain

+0

实际上,我需要它的矩阵乘法,所以我很害怕quadtree会在这里很有用 – turbo