2010-12-05 14 views
0

部分行列の再帰的な処理(メソッドに渡された元の行列を4に分けて)を行う必要があります。行列は2D配列として格納されます。非常に高価であることが判明したので、毎回新しいマトリックスに要素をコピーすることはできません。 Javaの部分行列を参照する方法はありますか?Javaでの部分行列の参照の取得

多分、質問は明らかではなかった、私は答えを得なかったhere

+1

あなたのオリジナルの質問は、あなたがここに書いたものよりもはっきりしていました!私はあなたがこれを閉じて、元のディスカッションを明確にしようとすることをお勧めします –

+0

あなたの質問はいくつかの詳細を投稿することができます明確ではありません。コードおそらく? – nixon

答えて

4

私はint[][]データの周りにラッパーを書き、Matrixクラスと呼んでいます。次に、方法getSubMatrix(x, y, rows, cols)を書きます。 ...

static class Matrix { 
    int[][] data; 
    int x, y, columns, rows; 

    public Matrix(int[][] data) { 
     this(data, 0, 0, data.length, data[0].length); 
    } 

    private Matrix(int[][] data, int x, int y, int columns, int rows) { 
     this.data = data; 
     this.x = x; 
     this.y = y; 
     this.columns = columns; 
     this.rows = rows; 
    } 

    public Matrix getSubMatrix(int x, int y, int columns, int rows) { 
     return new Matrix(data, this.x + x , this.y + y, columns, rows); 
    } 

    public String toString() { 

     StringBuffer sb = new StringBuffer(); 

     for (int i = y; i < x + rows; i++) { 
      for (int j = x; j < x + columns; j++) 
       sb.append(data[i][j]).append(" "); 

      sb.append("\n"); 
     } 
     sb.setLength(sb.length() - 1); 

     return sb.toString(); 
    } 
} 

このテストプログラム:これは単純なMatrixクラスである

public static void main(String[] args) throws IOException { 

    int[][] testData = new int[10][10]; 

    for (int i = 0; i < testData.length; i++) 
     for (int j = 0; j < testData[i].length; j++) 
      testData[i][j] = 100 + i + j; 

    Matrix full = new Matrix(testData); 

    System.out.println("Full test matrix:"); 
    System.out.println(full); 

    System.out.println(); 

    System.out.println("Part of the matrix:"); 
    System.out.println(full.getSubMatrix(3, 3, 3, 3)); 

} 

...プリント:

Full test matrix: 
100 101 102 103 104 105 106 107 108 109 
101 102 103 104 105 106 107 108 109 110 
102 103 104 105 106 107 108 109 110 111 
103 104 105 106 107 108 109 110 111 112 
104 105 106 107 108 109 110 111 112 113 
105 106 107 108 109 110 111 112 113 114 
106 107 108 109 110 111 112 113 114 115 
107 108 109 110 111 112 113 114 115 116 
108 109 110 111 112 113 114 115 116 117 
109 110 111 112 113 114 115 116 117 118 

Part of the matrix: 
106 107 108 
107 108 109 
108 109 110 
+0

ありがとう!私は乗算がかなり厳しいだろうと思う。 – devnull

+0

とにかくデータ配列全体を渡していると思いますが、文字列はサブマトリックスを表示するように調整されていますか? –

0

あなたはすでに参照している質問のLagerbaerから回答を得ています。実際には配列への参照である配列と、元の配列の最小xおよびy座標である4つの余分なパラメータを渡すだけです。

0

List<List<Integer>>を保存する新しいクラスが必要だと思います。この場合、いくつかのサブリストを作成し、それに他のプロセスを渡す確率があります。

0

テンプレートクラスの定義について次のようにする方法:

template <class V, class I = int, class S = FullMatrix<V> > 
class Matrix{ 
private: 
    S m_structure; //The matrix structure 
    I m_rowstart;//Row start index 
    I m_columnstart;//Column start index 
} 

主要なコンストラクタwou

I MinRowIndex() const; 

次に、あなたは行列の行/列の数を指示する機能を持っている:ldはあなたが、フォームの最小/最大行/列のインデックスを返すための機能を持っているでしょう

Matrix(); 
Matrix(size_t r, size_t c);//r rows and c columns 
Matrix(size_t r, size_t c, I rowStart, I columnStart);//rowstart and columnstart are given start indices 
Matrix(const Matrix<V, I, S>& source); 

こと。そして

size_t Rows() const; 

、所与の行の要素及び列

へのアクセスを許可する要素そして

void Row(I row, const Array<V, I>& val);//Replace row 

の別のアレイ、オーバーロード()によって行/列の要素の交換を可能にする機能

const V& operator()(I row, I column) const;//Get Element 
V& operator() (I row, I column); 

この方法の利点を確認するには、大きな行列を維持することと比較して、さまざまなサブ配列の個々の開始/停止インデックスここでの利点の1つは、各サブマトリックスが独立していることです。転置、移動、置換が可能です。おそらく、このマトリックスがサブ構造である高次のマトリックス構造を維持する必要があるかもしれません。

しかし、サブマトリクスを個別に参照できるというあなたの疑問を満足するようです。

関連する問題