**転置行列(C言語版)のソースプログラム [#n4991da9]
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #define BUFSIZE 300	/* 
 			 * size of BUFSIZE is 
 			 *             size of buffer(tok)
 			 *           + size of delimiter
 			 *           + size of carriege return character
 			 *           + size of NUL
 			 */
 
 	/*                        COL
 	 *              |------------------------
 	 *                col[0]    col[1]   ...
 	 *      -       +---------+---------+----
 	 *      | row[0]|mat[0][0]|mat[0][1]|
 	 *      |       +---------+---------+----
 	 *  ROW | row[1]|mat[1][0]|mat[1][1]|
 	 *      |       +---------+---------+----
 	 *      | row[2]|mat[2][0]|mat[2][1]|
 	 *      |       +---------+---------+----
 	 *      |       | ...
 	 *
 	 * row+i point to col.
 	 *
 	 * We have Matrix 'mat', 
 	 * then mathematical mat(i,j) is equivalent to *(*(row+i) + j)
 	 */
 
 struct matrix {
 	double **data;
 	int rows;	/* gyou */
 	int cols;	/* retu */
 };
 
 
 void 
 init_matrix(struct matrix *mat, int rows, int cols)
 {
 	int i;
 	mat->rows = rows;
 	mat->cols = cols;
 	mat->data = (double **)malloc(rows*sizeof(double *));
 	for (i=0; i<rows; ++i) {
 		*(mat->data+i) = malloc(cols*sizeof(double));
 	}
 }
 
 void 
 free_matrix(struct matrix *mat)
 {
 
 	int i;
 	int rows = mat->rows, cols = mat->cols;
 	for (i=0; i<rows; ++i) {
 		free(*(mat->data+i));
 		*(mat->data+i) = NULL;
 	}
 	free(mat->data);
 	mat->data = NULL;
 }
 
 void
 set_matrix_dialog(struct matrix *m)
 {
 	int i, j;
 	double n;
 	char buf[BUFSIZE];
 	for (j=0; j<m->rows; ++j) {
 		for (i=0; i<m->cols; ++i) {
 			printf("input value at (%d, %d) element: ", i, j);
 			fgets(buf, BUFSIZE-1, stdin);
 			sscanf_s(buf, "%lf", &n);
 			*(*(m->data+j) + i) = n;
 		}
 	}
 }
 
 void
 set_matrix(struct matrix *m)
 {
 	int i, j;
 	double *n = NULL;
 	char buf[BUFSIZE], *pbuf, *tok, *nx_tok = NULL, *delim = " \n";
 
 	n = malloc(m->cols*sizeof(double));
 
 	printf("Input [%d] value space separated.\n", m->cols);
 	for (j=0; j<m->rows; ++j) {
 		memset(n, 0, m->cols*sizeof(double));
 
 		printf("row %d: ", j);
 		fgets(buf, BUFSIZE-1, stdin);
 		pbuf = buf;
 
 		for (i=0; i<m->cols && (tok=strtok_s(pbuf, delim, &nx_tok)) != NULL; pbuf=NULL, ++i) {
 			*(n+i) = atof(tok);
 		}
 
 		for (i=0; i<m->cols; ++i) {
 			*(*(m->data+j) + i) = *(n+i);
 		}
 	}
 		
 	free(n);
 	n = NULL;
 }
 
 void 
 print_matrix(struct matrix *m)
 {
 	int i, j;
 
 	for (j=0; j<m->rows; ++j) {
 		for (i=0; i<m->cols; ++i) {
 			printf("%8.3f ", *(*(m->data+j) + i));
 		}
 		printf("\n");
 	}
 	printf("\n");
 }
 
 void 
 transpose_matrix(struct matrix *dest, struct matrix *src)
 {
 	int i, j;
 
 	for (j=0; j<dest->rows; ++j) {
 		for (i=0; i<dest->cols; ++i) {
 			*(*(dest->data+j) + i) = *(*(src->data+i) + j);
 		}
 	}
 }
 
 int 
 main()
 {
 	struct matrix mat[2];
 	int rows = 3;		/* modify if necessary */
 	int cols = 2;		/* modify if necessary */
 
 	init_matrix(&mat[0], rows, cols);
 	init_matrix(&mat[1], cols, rows);	/* for transposed matrix */
 
 	/* Uncomment alternative */
 	//set_matrix_dialog(&mat[0]);
 	set_matrix(&mat[0]);
 
 	puts("[matrix]");
 	print_matrix(&mat[0]);
 	transpose_matrix(&mat[1], &mat[0]);
 	puts("[transposed matrix]");
 	print_matrix(&mat[1]);
 
 	free_matrix(&mat[0]);
 	free_matrix(&mat[1]);
 
 	getchar();
 	return 0;
 }

**回答部分 [#abf5bed3]
問題の回答部分は
 void 
 transpose_matrix(struct matrix *dest, struct matrix *src)
です。

main()のmat[0]がユーザが用意する行列。
mat[1]がその転置行列になります。

その他の箇所は入力部分だとか表示部分、エラー処理なので気にする人だけ気にしてください。

**使い方 [#ddeb970a]
 Input 2 value space separated.
 row 0: 
と表示されたら、スペース区切りで列の分だけ値を入力してあげてください。
行ずつ入力するようにしてあります。

1要素ずつ入力する場合は
 set_matrix(&mat[0]);
をコメントして、
 //set_matrix_dialog(&mat[0]);
をアンコメントしてあげてください。


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS