搜尋此網誌

[C/C++][矩陣轉置]

/*
* File Name: Matrix_Transpose
* Author: MH
* Since 2011/03/21
* Toolkit: Dev C++
*/

# include <stdlib.h>
# include <stdio.h>

int main(){

    int i, j, count=0, temp;
    int c[3][3] = {{1,2,3},{4,5,6},{7,8,9}};

    printf("before transposing\n");

    for(i=0; i<3; i++){

        printf("|");

        for(j=0; j<3; j++){
            printf("% -3d", c[i][j]);
        }

        printf("|\n");

    }

    printf("\nafter transposing\n");

    for(i=0; i<3; i++){

        for(j=i; j<3; j++){
            temp = c[i][j];
            c[i][j] = c[j][i];
            c[j][i] = temp;
            count++;
        }

    }

    for(i=0; i<3; i++){

        printf("|");

        for(j=0; j<3; j++){
            printf("% -3d", c[i][j]);
        }

        printf("|\n");

    }

    printf("\ncount of swaps = %d times\n\n", count);

    system("Pause");
    return 0;
}

在作矩陣轉置的時候,常會有人在第二層迴圈時寫成

for(i=0; i<3; i++){
    for(j=0; j<3; j++){
        temp = c[i][j];
        c[i][j] = c[j][i];
        c[j][i] = temp;
        count++;
    }
}


這樣會造成轉置後的元素再被轉置一次,所以執行時會發現矩陣根本沒變,因此轉過的就不用再轉了,這就是第二層設成j=i的原因

另外方正矩陣對角線轉置之後還是自己,所以i=j時其實是不用轉的,可以將程式碼改成下面的形式

printf("\nafter transposing\n");

for(i=0; i<3; i++){
   for(j=i+1; j<3; j++){
       temp = c[i][j];
       c[i][j] = c[j][i];
       c[j][i] = temp;
       count++;
   }
}


如此一來可以減少不必要的轉置

沒有留言:

張貼留言