2010-12-05 4 views
0

Мне нужно рекурсивно выполнять параллельную обработку субматриц (исходная матрица, деленная на 4, передается в метод). Матрица хранится как 2D-массив. Я не могу копировать элементы каждый раз в новую матрицу, поскольку она оказывается очень дорогой. Есть ли способ ссылки на подматрицы в java?Получение ссылки на подматрицу в java

Возможно, вопрос был не ясен, я не получил ответа here.

+1

Ваш первоначальный вопрос был яснее, чем вы написали здесь! Я предлагаю вам закрыть это и попытаться уточнить исходную дискуссию – 2010-12-05 11:56:16

+0

Ваш вопрос непонятен, можете ли вы разместить дополнительную информацию. Код Возможно? – nixon 2010-12-05 11:44:36

ответ

4

Я бы написал обертку вокруг данных int[][] и назвал ее классом Matrix. Затем напишите метод getSubMatrix(x, y, rows, cols). Это простой класс Matrix:

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(); 
    } 
} 

Эта тестовая программа ...:

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

У вас уже есть ответ от Lagerbaer в вопросе, на который вы ссылаетесь. Вы просто передаете массив (который фактически является ссылкой на массив) и еще 4 дополнительных параметра, которые являются минимальными и максимальными координатами x и y в исходном массиве.

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 л.д. быть

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); 

Вы бы тогда функции возвращать индексы минимум/максимум строк/столбцов формы:

I MinRowIndex() const; 

Далее, у вас есть функции, необходимо указать число строк/столбцов в матрице ,

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); 

Возможно, необходимо провести вычислительные испытания, чтобы проверить преимущества этого метода по сравнению с поддержанием большой матрицы и отдельных показателей запуска/останова различных подматриц s (как было предложено Лагербаером в другом потоке), одно преимущество заключается в том, что каждая подматрица независима. Их можно транспонировать, перемещать, заменять. Возможно, вам, вероятно, потребуется поддерживать матричную структуру более высокого уровня, в которой эта матрица является подструктурой.

Но, похоже, он удовлетворяет вашему вопросу о возможности ссылаться на подматрицы независимо.