日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

C++写矩阵的转置

發(fā)布時間:2024/1/3 综合教程 41 生活家
生活随笔 收集整理的這篇文章主要介紹了 C++写矩阵的转置 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  (2019年2月19日注:這篇文章原先發(fā)在自己github那邊的博客,時間是2017年2月5日)

  對于任意非n階矩陣的轉(zhuǎn)置,用c++應(yīng)該怎么寫代碼,思考了一下,發(fā)現(xiàn)并沒有那么簡單,上網(wǎng)找到了一個比較好的算法,叫做矩陣原地轉(zhuǎn)置矩陣算法。基于別人的代碼,改寫成可以使用指針動態(tài)分配內(nèi)存的方法。

  先放傳送門:C++實現(xiàn)矩陣原地轉(zhuǎn)置算法的實現(xiàn)

  原理并不難,那篇文章非常的詳細(xì),我不再贅述,下面把改寫好的代碼發(fā)出來。

 1 /*************************************************************************
 2 > File Name: matrix_transpose.cpp
 3 > Author: SongLee
 4 > Modified: JCChan
 5 ************************************************************************/
 6 #include<iostream> 
 7 using namespace std;
 8 /* 后繼 */
 9 int getNext(int i, int m, int n)
10 {
11     return (i%n)*m + i / n;
12 }
13 /* 前驅(qū) */
14 int getPre(int i, int m, int n)
15 {
16     return (i%m)*n + i / m;
17 }
18 /* 處理以下標(biāo)i為起點的環(huán) */
19 void movedata(int *mtx, int i, int m, int n)
20 {
21     int temp = mtx[i]; // 暫存 
22     int cur = i;    // 當(dāng)前下標(biāo) 
23     int pre = getPre(cur, m, n);
24     // 從最后一個數(shù)開始,獲得它的前驅(qū),直到前驅(qū)的值和最后一位值相等,相當(dāng)于交換的逆過程
25     while (pre != i)
26     {
27         mtx[cur] = mtx[pre];
28         cur = pre;
29         pre = getPre(cur, m, n);
30     }
31     mtx[cur] = temp;
32 }
33 /* 轉(zhuǎn)置,即循環(huán)處理所有環(huán) */
34 void transpose(int *mtx, int m, int n)
35 {
36     for (int i = 0; i<m*n; ++i)
37     {
38         int next = getNext(i, m, n);
39         while (next > i) // 若存在后繼小于i說明重復(fù) 
40             next = getNext(next, m, n);
41         if (next == i)  // 處理當(dāng)前環(huán)  
42             movedata(mtx, i, m, n);
43     }
44 }
45 void input(int *mtx, int row, int column) {
46     for (int i = 0; i < row; i++) {
47         for (int j = 0; j < column; j++) {
48             cout << "請輸入矩陣的第" << i + 1 << "行第" << j + 1 << "個元素:";
49             //    根據(jù)矩陣的坐標(biāo)推算它在一維數(shù)組中的位置。
50             cin >> *(mtx + column*i + j);
51         }
52     }
53 }
54 /* 輸出矩陣 */
55 void print(int *mtx, int m, int n)
56 {
57     for (int i = 0; i<m*n; ++i)
58     {
59         if ((i + 1) % n == 0)
60             cout << mtx[i] << "
";
61         else
62             cout << mtx[i] << " ";
63     }
64 }
65 /* 測試 */
66 int main()
67 {
68     int row, column;
69     cout << "請輸入矩陣的行數(shù):";
70     cin >> row;
71     cout << "請輸入矩陣的列數(shù):";
72     cin >> column;
73     int *matrix = new int[row*column];
74     input(matrix, row, column);
75     cout << "Before matrix transposition:" << endl;
76     print(matrix, row, column);
77     transpose(matrix, row, column);
78     cout << "After matrix transposition:" << endl;
79     print(matrix, column, row);
80     delete[] matrix;
81     system("pause");
82     return 0;
83 }

  結(jié)果如下

  對于n階方陣來說,情況則簡單的多,同樣放上代碼。

 1 #include<iostream>
 2 using namespace std;
 3 void move(int *matrix, int n)
 4 {
 5     int i, j, k;
 6     for (i = 0; i<n; i++)
 7         for (j = 0; j<i; j++)
 8         {
 9             k = *(matrix + i*n + j);
10             *(matrix + i*n + j) = *(matrix + j*n + i);
11             *(matrix + j*n + i) = k;
12         }
13 }
14 int main()
15 {
16     int n, i, j;
17     int *p;
18     cout << "請輸入矩陣的維數(shù):";
19     cin >> n;
20     p = new int[n*n];
21     cout << "輸入矩陣的元素" << endl;
22     for (i = 0; i<n; i++)
23         for (j = 0; j<n; j++)
24         {
25             cout << "第" << i + 1 << "行第" << j + 1
26                 << "個元素為:";
27             cin >> p[i*n + j];
28         }
29     cout << "輸入的矩陣的為:" << endl;
30     for (i = 0; i<n; i++)
31     {
32         for (j = 0; j<n; j++)
33             cout << p[i*n + j] << " ";
34         cout << endl;
35     }
36     move(p, n);
37     cout << "轉(zhuǎn)置后的矩陣的為:" << endl;
38     for (i = 0; i<n; i++)
39     {
40         for (j = 0; j<n; j++)
41             cout << p[i*n + j] << " ";
42         cout << endl;
43     }
44     delete[] p;
45     system("pause");
46     return 0;
47 }

總結(jié)

以上是生活随笔為你收集整理的C++写矩阵的转置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。