1

以下のように、行列を転置しようとしています。参照によって配列を渡しているのですが、どういうわけか機能していません(AFTERはBEFOREと同じです)。理由はわかりません。

しかし、私が本当に驚いたのは、transpose()関数内でも配列が転置されていないことです(INSIDEがBEFOREと同じになるにはどうすればよいですか??)。私は何が欠けていますか?

#include <iostream>

template <int M, int N>
void print1(int (&src)[M][N]) {
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < N; j++)
            printf("%2d\t", src[i][j]);
        std::cout << std::endl;
    }
}

template <int M, int N>
void transpose(int (&src)[M][N]) {
    for(int i = 0; i < M; i++) {
        for(int j = 0; j < N; j++) {
            if (i == j) continue;
            int temp = src[i][j];
            src[i][j] = src[j][i];
            src[j][i] = temp;
        }
    }
    std::cout << "\nINSIDE:\n";
    print1(src);
}

int main() {

    int src[][4] = {
        { 1,  2,  3,  4},
        { 5,  6,  7,  8},
        { 9, 10, 11, 12},
        {13, 14, 15, 16},
    };

    std::cout << "BEFORE:\n";
    print1(src);
    transpose(src);

    std::cout << "\nAFTER:\n";
    print1(src);
}

出力:

$ ./a.out
BEFORE:
 1       2       3       4
 5       6       7       8
 9      10      11      12
13      14      15      16

INSIDE:
 1       2       3       4
 5       6       7       8
 9      10      11      12
13      14      15      16

AFTER:
 1       2       3       4
 5       6       7       8
 9      10      11      12
13      14      15      16
$
4

2 に答える 2

3

あなたは多分それを二度転置していますか?

for(int i = 0; i < M; i++) {
    for(int j = 0; j < N; j++) {
        if (i == j) continue;
        int temp = src[i][j];
        src[i][j] = src[j][i];
        src[j][i] = temp;
    }
}

つまり、...の代わりsrc(i,j)に使用しsrc(j,i)、次に?の代わりsrc(j,i)に使用します。src(i,j)

于 2012-06-02T09:48:16.777 に答える
0

より良い最適化は

for(int i = 0; i < M; i++) {
    for(int j = 0; j < i; j++) { <----------------  Compare j with i and not with N
        // if (i == j) continue;    <----------------  No need to do this extra check
        int temp = src[i][j];
        src[i][j] = src[j][i];
        src[j][i] = temp;
    }
}
于 2012-06-02T14:03:38.613 に答える