2

NxN 行列があり、このコードで転置しようとしています:

    for(int i = 0; i < mat_size; ++i) {
        for(int j = 0; j < mat_size; ++j) {
            double tmpJI = get(j, i);
            put(j, i, get(i, j));
            put(i, j, tmpJI);
        }
    }

うまくいかない、何が問題なの?前もって感謝します。

4

5 に答える 5

10

マトリックス全体をそれ自体と交換しているため、機能しません。あなたがする必要があるのは、上の三角形を下の三角形と交換することです:

for(int j = 0; j < i; ++j) {

一方向です。

于 2013-10-22T10:37:03.463 に答える
2

0 から mat_size にすると、マトリックス全体が 2 回並べ替えられ、元のものが再び取得されます。

への変更 :

for(int i = 0; i < mat_size; ++i) {
    for(int j = 0; j < i; ++j) {
        double tmpJI = get(j, i);
        put(j, i, get(i, j));
        put(i, j, tmpJI);
    }
}
于 2013-10-22T10:38:22.470 に答える
1

j > i の場合にのみスワップする必要があります。したがって、内側のループは i+1 から開始する必要があります。j==i (中央の対角線) の場合、交換も必要ありません。

実際に2回スワップしているため、ソリューションは機能しません(1回はj = xとi = yで、1回はj = yとi = x.

于 2013-10-22T10:38:45.590 に答える
0

たとえば、(2,5) は i=2,j=5 と i=5,j=2 に交換されます。2回スワップしても何も起こりません。

for(int i = 0; i < mat_size; ++i) {
    for(int j = 0; j < i; ++j) {
        double tmpJI = get(j, i);
        put(j, i, get(i, j));
        put(i, j, tmpJI);
    }
}
于 2013-10-22T10:36:43.040 に答える
0

これは、反復が対角線の反対側に到達すると、行列の下三角形で交換した要素が再び交換されるためです。つまり、要素が2回スワップされ、結果は何もありません。試す:

for(int i = 0; i < mat_size; ++i) {
for(int j = 0; j < i; ++j) {
    double tmpJI = get(j, i);
    put(j, i, get(i, j));
    put(i, j, tmpJI);
  }
}
于 2013-10-22T10:39:53.297 に答える