2011-06-19 4 views
1

私は1つの2Dマトリックスを持っています。私の問題は、それを4つの部分行列に論理的に分割する必要があります。例えば、元の行列が4 * 4である場合、2 * 2の4つの部分行列が存在する。 元行列の(0,2)、(2,0)および(2,2)インデックスは(0,0)で始まります。 プログラム中に何度も値にアクセスして設定しています。サブ行列の要素には、行列[x] [y] .at(row、col)のようにアクセスしたいと思います。ここで、x、yは部分行列の番号と行を指定し、colはその部分行列を(行、 col)。 行列[2] [2] .at [0] [0] - >は、4番目の部分行列の最初の要素を与える必要があります。2次元マトリックスのデータ構造の設計

ご協力いただきありがとうございます。

おかげでアドバンス

答えて

1

ここで問題が何かわかりません。基本的には、2-dマトリックスの要素に対処するための疑似セマンティックapiが必要です。配列に読み書きする(想定されているランダムな)ことに注意してください。私たちはあなたがスレッド問題を扱っていないと仮定します。

Foo、Foo [] []型の2次元配列は、確実に動作します。あなたは基本的にそれを包む必要があります。

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 をインターフェイスにし、MatrixからQuadrantを拡張します。 – alphazero

0

にあなたは空間充填カーブで見てみたいです。 sfcは2dの複雑さを1dの複雑さに減らします。クアッドツリーを理解するのに役立ち、クォードツリーのように使うこともできます。あなたはニックのヒルベルト曲線quadtree空間インデックスのブログを見たいと思う。

+0

少しシンプルなアプローチがありますか? – turbo

+0

多分、2dから1dの複雑さを減らすことは価値があり、あなたの問題を大きく助けるでしょう!しかし、クアッドツリーがあなたの問題を助けることができるかどうかを私に教えてもらえれば、すぐにあなたの質問を解決できますか? – Bytemain

+0

実際に私は行列乗算のためにそれを必要とするので、恐らくquadtreeは役に立つでしょう – turbo