Получение ссылки на подматрицу в Java - PullRequest
0 голосов
/ 05 декабря 2010

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

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

Ответы [ 4 ]

4 голосов
/ 05 декабря 2010

Я бы написал обертку вокруг данных 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 голосов
/ 05 декабря 2010

Как насчет определения класса шаблона следующим образом:

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
}

Основными конструкторами будут

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;

Затем функция, позволяющая заменять элементы в строке/ column другим массивом элементов

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

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

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

0 голосов
/ 05 декабря 2010

Я думаю, вам нужен новый класс, который будет хранить List<List<Integer>>. В этом случае у вас будет возможность составить несколько подсписков и передать их другому процессу.

0 голосов
/ 05 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...