1. 程式人生 > >C語言矩陣轉置程式碼及解析

C語言矩陣轉置程式碼及解析

問題描述

編寫一個程式,將一個3行3列的矩陣轉置。

問題分析

要解決該問題應該清楚什麼是矩陣的轉置。矩陣轉置在數學上的定義為:設A為m×n階矩陣(即m行n列的矩陣),其第i行第j列的元素是a(i,j),即:

A=a(i,j)m×n

定義A的轉置為這樣一個n×m階矩陣B,滿足:

B=a(j,i)m×n

即b(i,j)=a(j,i)(B的第 i行第j列元素是A的第j行第i列元寒),記為A’=B。

假設有如下的矩陣A:

則經過轉置後,即將矩陣的第i行變成了現在的第i列,則原來的矩陣A變為如下矩陣B:

演算法設計

解決矩陣問題時通常都是先將矩陣存放在一個二維陣列中,而當矩陣發生變化時,二維陣列中的對應元素也會發生變化。

以問題分析中提到的A矩陣為例,要實現A的轉置,首先應將其存放在一個二維陣列n中,該二維陣列中的元素及其內容如表A所示。

n[0][0] n[0][1] n[0][2]
1 2 3
n[1][0] n[1][1] n[1][2]
4 5 6
n[2][0] n[2][1] n[2][2]
7 8 9

將A轉置後,二維陣列中元素的內容會發生變化。A轉置後,二維陣列n中的元素內容如表B所示。

n[0][0] n[0][1] n[0][2]
1 4 7
n[1][0] n[1][1] n[1][2]
2 5 8
n[2][0] n[2][1] n[2][2]
3 6 9


轉置後矩陣主對角線上的陣列元素n[0][0]、n[1][1]、n[2][2]的值並沒有發生變化,只是位於對角線右上方的三個元素與位於對角線左下方的三個元素的值進行了交換。具體為:n[0][1]與n[1][0]進行了交換,n[0][2]與n[2][0]進行了交換,n[1][2]與進行了交換。

根據這個發現就可以來設計演算法,在對一個3x3階矩陣轉置時,只需將主對角線右上方的陣列元素n[0][1]、n[0][2]、n[1][2],分別與主對角線左下放的陣列元素n[1][0]、n[2][0]、n[2][1]的值,通過一個臨時變數進行交換即可,總共只要進行3次交換就可以實現矩陣的轉置。

下面是完整的程式碼:

#include<stdio.h>
int main()
{
    int n[3][3]={1, 2, 3, 4, 5, 6, 7, 8, 9};
    int i, j, temp;
    printf("原始矩陣:\n");
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
            printf("%d  ", n[i][j]);  /*輸出原始矩陣*/
        printf("\n");
    }
    for(i=0; i<3; i++)
        for(j=0; j<3; j++)
        {
            if (j>i)
            {  /*將主對角線右上方的陣列元素與主對角線左下方的陣列元素進行單方向交換*/
                temp=n[i][j];
                n[i][j]=n[j][i];
                n[j][i]=temp;
            }
        }
    printf("轉置矩陣:\n");
    for(i=0; i<3; i++)
    {
        for(j=0; j<3; j++)
            printf("%d  ", n[i][j]);  /*輸出原始矩陣的轉置矩陣*/
        printf("\n");
    }
    return 0;
}

執行結果:
原始矩陣:
1  2  3
 4  5  6
 7  8  9
轉置矩陣:
1  4  7
 2  5  8
 3  6  9

C語言矩陣轉置

知識點補充

已知有一個3×4的矩陣,要求程式設計求出其中值最大的那個元素所在的行號和列號及該元素的值。

顯然,要解決這個問題必須要遍歷矩陣中的每個元素,因此,程式的結構就是一個雙重的for迴圈,在迴圈體中進行的就是矩陣元素的比較,找出最大元素。

下面是完整的程式碼:

#include<stdio.h>
int main()
{
    int i, j, row=0, column=0,max;
    int a[3][4]={{2, 7, 3, 6}, {8, 1, 9, 5}, {10, 4, 2, 5}};
    max=a[0][0];  /*設定max的初值*/
    /*矩陣中每一個元素逐一與max進行比較*/
    for(i=0; i<=2; i++)
        for(j=0; j<=3; j++)
            if(a[i][j]>max)
            {
                max=a[i][j];
                row=i;
                column=j;
            }
    printf("矩陣的最大值為:%d,其所在行為第%d行,所在列為第%d列\n", max, row, column);
    return 0;
}

執行結果:

矩陣的最大值為:10,其所在行為第2行,所在列為第0列

C語言矩陣轉置