串行算法实现矩阵转置

来聊一聊,串行算法逆置矩阵是如何办到的。
首先我们要建立一个矩阵了,不然谈何转置。
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
串行算法实现矩阵转置_第1张图片
完整代码如下。

#include 
#include 
#include 
#include 
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

好了,这样我们就完成了串行算法的矩阵转置。
如有错误,希望不吝赐教,大家共同进步。

你可能感兴趣的:(并行计算)