(2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2017年2月5日)
对于任意非n阶矩阵的转置,用c++应该怎么写代码,思考了一下,发现并没有那么简单,上网找到了一个比较好的算法,叫做矩阵原地转置矩阵算法。基于别人的代码,改写成可以使用指针动态分配内存的方法。
先放传送门:
原理并不难,那篇文章非常的详细,我不再赘述,下面把改写好的代码发出来。
1 /************************************************************************* 2 > File Name: matrix_transpose.cpp 3 > Author: SongLee 4 > Modified: JCChan 5 ************************************************************************/ 6 #include7 using namespace std; 8 /* 后继 */ 9 int getNext(int i, int m, int n)10 {11 return (i%n)*m + i / n;12 }13 /* 前驱 */14 int getPre(int i, int m, int n)15 {16 return (i%m)*n + i / m;17 }18 /* 处理以下标i为起点的环 */19 void movedata(int *mtx, int i, int m, int n)20 {21 int temp = mtx[i]; // 暂存 22 int cur = i; // 当前下标 23 int pre = getPre(cur, m, n);24 // 从最后一个数开始,获得它的前驱,直到前驱的值和最后一位值相等,相当于交换的逆过程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 /* 转置,即循环处理所有环 */34 void transpose(int *mtx, int m, int n)35 {36 for (int i = 0; i i) // 若存在后继小于i说明重复 40 next = getNext(next, m, n);41 if (next == i) // 处理当前环 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 // 根据矩阵的坐标推算它在一维数组中的位置。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 > row;71 cout << "请输入矩阵的列数:";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 }
结果如下
对于n阶方阵来说,情况则简单的多,同样放上代码。
1 #include2 using namespace std; 3 void move(int *matrix, int n) 4 { 5 int i, j, k; 6 for (i = 0; i > n;20 p = new int[n*n];21 cout << "输入矩阵的元素" << endl;22 for (i = 0; i > p[i*n + j];28 }29 cout << "输入的矩阵的为:" << endl;30 for (i = 0; i