2

行列転置を並列化する方法は?

行列を転置するには、これについて何かを適用する必要があることを知っています:

for (int i = 0; i < matrix.length - 1; i++) {
    for (int j = i + 1; j < matrix[i].length; j++) {
        tmp = matrix[i][j];
        matrix[i][j] = matrix[j][i];
        matrix[j][i] = tmp;
    }
}

しかし、この操作を並列化する方法はわかりません。

行列 4n x 4n を転置するには、N 個のスレッドを作成する必要があります。

4

3 に答える 3

8

これは宿題のように聞こえるので、すぐに答えを出すことはできませんが、正しい方向を示します。

4x4 行列を転置しているとしましょう:

A B C D      A E I M
E F G H  ->  B F J N
I J K L      C G K O
M N O P      D H L P

これを 4 つのサブマトリックスに分解すると、次のようになります。

A B | C D      A E | I M
E F | G H      B F | J N
----+----  ->  ----+----
I J | K L      C G | K O
M N | O P      D H | L P

結果として得られる 4 つの部分行列はすべて、開始した 4 つの行列の転置であることに注意してください (右上と左下の行列が入れ替わっています)。これをどのように活用できますか?:)

于 2013-05-31T20:53:13.340 に答える
0

問題に対する単純な並列ソリューションが必要な場合は、このようなものがうまくいく可能性があります。

double[][] matrix=new double[numberOfRows][numberOfColumns];
double[][] transpose = new double[numberOfColumns][numberOfRows];
IntStream.range(0, numberOfColumns * numberOfRows).parallel().forEach(i ->
{
    int m = i / numberOfRows;
    int n = i % numberOfRows;
    transpose[m][n] = matrix[n][m];
});

これは、行列内の要素数に対して実行される並列化された for ループと考えることができる並列 IntStream を使用します。転置の対象とする必要がある実際の行と列を取得するために、2 つの変数を割り当てたことに注意してください。

ストリームの現在のインデックス i を行数で割ると、転置行列のターゲット行のインデックスが得られます。インデックス i のモジュロと行数は、割り当てられる転置行列の列を示します。

于 2018-06-21T10:51:15.783 に答える