来聊一聊,串行算法逆置矩阵是如何办到的。
首先我们要建立一个矩阵了,不然谈何转置。
OK我们来一起看一看,如何建立一个矩阵,其实有很多种方法啦,这里我们来看一个自由度比较高的吧,动态创建并释放一个二维数组。
int **matrix;//声明一个二维数组
void init(int n){
//首先,matrix类型为int **,我们想建立一个n*n的数组,自然要为它分配n个int*的大小空间
matrix = (int **)malloc(n * sizeof(int *));
for(int i=0;i<n;i++){
//每一行有n个int型的数据
matrix[i] = (int *)malloc(n * sizeof(int));
}
//如果想要自己赋初值下面这些就不用看了,这里我就直接给赋上值了
int cnt = 0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
matrix[i][j] = cnt;
cnt++;
}
}
}
释放也很简单了,一句搞定
void free(int n){
free(matrix);
}
那么我们来重点看一看,我们的算法是什么样的吧,大致思路其实很轻松,我们知道n*n的矩阵是一个正方形,沿对角线翻折一下,就可以得到转置矩阵了,那我们的想法就很明确了。
void serial(int row,int column,int n){
for(int i=row;i<n;i++){
for(int j=column;j<i;j++){
int tmp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = tmp;
}
}
}
大概像下面这种感觉,突然发现我画图真丑,23333
完整代码如下。
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
int **matrix;
void serial(int row,int column,int n){
for(int i=row;i<n;i++){
for(int j=column;j<i;j++){
int tmp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = tmp;
}
}
}
void init(int n){
matrix = (int **)malloc(n * sizeof(int *));
for(int i=0;i<n;i++){
matrix[i] = (int *)malloc(n * sizeof(int));
}
int cnt = 0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
matrix[i][j] = cnt;
cnt++;
}
}
}
void free(int n){
free(matrix);
}
void print(int n){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
int main(int argc, const char * argv[]) {
int n = 10;//如果是在linux端,可改成这个atoi(argv[1]);
init(n);
serial(0,0,n);
print(n);
free(n);
return 0;
}
结果如下
0 10 20 30 40 50 60 70 80 90
1 11 21 31 41 51 61 71 81 91
2 12 22 32 42 52 62 72 82 92
3 13 23 33 43 53 63 73 83 93
4 14 24 34 44 54 64 74 84 94
5 15 25 35 45 55 65 75 85 95
6 16 26 36 46 56 66 76 86 96
7 17 27 37 47 57 67 77 87 97
8 18 28 38 48 58 68 78 88 98
9 19 29 39 49 59 69 79 89 99
好了,这样我们就完成了串行算法的矩阵转置。
如有错误,希望不吝赐教,大家共同进步。