プログラミング論 I 行列の演算 http://www.ns.kogakuin.ac.jp/~ct13140/Prog
FAQ: #defineとは? 文字列を定義して,それ以降置換する. 置換 置換 置換 #define MAX 10 void main(){ int i=MAX; printf("%d\n", i); } void main(){ int i=10; printf("%d\n", i); } 置換 10/2*5は, 25です. 左から順に 計算 #define MAX 2*5 void main(){ int i=10/MAX; printf("%d\n", i); } void main(){ int i=10/2*5; printf("%d\n", i); } 置換 #define MAX (2*5) void main(){ int i=10/MAX; printf("%d\n", i); } void main(){ int i=10/(2*5); printf("%d\n", i); } 置換
概要 行列の演算 簡単
行列
行列 m行n列の行列 (m×n行列) 通常,行列の添え字は1から始めて a11~amnと記すがが,
行列の和 m行n列の行列 と m行n列の行列 の和 =
行列の積 l×m行列 と m×n行列 の積は,l×n行列 = ただし,0≦i<l , 0≦j<n
行列の積 4×5行列 と 5×4行列 の積は,4×4行列 = ただし,0≦i<5 , 0≦j<5
行列の加算 17 void main(){ 18 double a[ROW][COL], b[ROW][COL]; 19 double s[ROW][COL]; 20 int r, c; 21 22 a[0][0]=0; a[0][1]= 1; a[0][2]=2; 23 a[1][0]=3; a[1][1]= 4; a[1][2]=5; 24 b[0][0]=6; b[0][1]= 7; b[0][2]=8; 25 b[1][0]=9; b[1][1]=10; b[1][2]=11; 26 27 printf("matrix a=\n"); 28 print_matrix(a); 29 printf("matrix b=\n"); 30 print_matrix(b); 31 32 /* begin : sum, s=a+b */ 33 for(r=0; r<ROW; r++){ 34 for(c=0; c<COL; c++){ 35 s[r][c] = a[r][c] + b[r][c]; 36 } 37 } 38 /* end : sum, s=a+b */ 39 40 printf("matrix s=\n"); 41 print_matrix(s); 42 } 1 /* sum.c 行列の加算 */ 2 #define COL 3 3 #define ROW 2 4 5 #include <stdio.h> 6 7 void print_matrix(double mat[COL][ROW]){ 8 int r, c; 9 for(r=0; r<ROW; r++){ 10 for(c=0; c<COL; c++){ 11 printf("%6.2lf ", mat[r][c]); 12 } 13 printf("\n"); 14 } 15 } 16
行列の乗算 20 void main(){ 21 double a[L][M], b[M][N], p[L][N]; 22 int l, m, n; 24 a[0][0]= 0; a[0][1]= 1; a[0][2]= 2; :省略 30 printf("matrix a=\n"); 31 print_matrix(a, L, M); 32 printf("matrix b=\n"); 33 print_matrix(b, M, N); 34 36 for(l=0; l<L; l++){ 37 for(n=0; n<N; n++){ 38 /* begin : calc p[l][n] */ 39 double sum = 0.0; 40 for(m=0; m<M; m++){ 41 sum += a[l][m]*b[m][n]; 42 } 43 p[l][n] = sum; 44 /* end : calc p[l][n] */ 45 } 46 } 48 49 printf("matrix s=\n"); 50 print_matrix(p, L, N); 51 } 1 /* pro.c 行列の乗算 2 (LxM 行列)×(MxN 行列) */ 3 4 #define L 2 5 #define M 3 6 #define N 4 7 8 #include <stdio.h> 9 10 void print_matrix (double *mat, int row, int col){ 11 int r, c; 12 for(r=0; r<row; r++){ 13 for(c=0; c<col; c++){ 14 printf("%6.2lf ", *(mat+col*r+c)); 15 } 16 printf("\n"); 17 } 18 } 19
11 printf("%6.2lf ", mat[r][c]); 35 s[r][c] = a[r][c] + b[r][c]; 25 b[1][0]=9; b[1][1]=10; b[1][2]=11; 22 a[0][0]=0; a[0][1]= 1; a[0][2]=2; 23 a[1][0]=3; a[1][1]= 4; a[1][2]=5; 24 b[0][0]=6; b[0][1]= 7; b[0][2]=8; 18 double a[ROW][COL], b[ROW][COL]; 7 void print_matrix(double mat[COL][ROW]){ 10 for(c=0; c<COL; c++){ 34 for(c=0; c<COL; c++){ 32 /* begin : sum, s=a+b */ 13 printf("\n"); 27 printf("matrix a=\n"); 29 printf("matrix b=\n"); 38 /* end : sum, s=a+b */ 40 printf("matrix s=\n"); 9 for(r=0; r<ROW; r++){ 33 for(r=0; r<ROW; r++){ 19 double s[ROW][COL]; 28 print_matrix(a); 30 print_matrix(b); 41 print_matrix(s); 1 /* sum.c 行列の加算 */ 12 } 36 } 5 #include <stdio.h> 8 int r, c; 20 int r, c; 2 #define COL 3 3 #define ROW 2 17 void main(){ 14 } 37 } 15 } 4 6 16 21 26 31 39 42 } sum.c
14 printf("%6.2lf ", *(mat+col*r+c)); 41 sum += a[l][m]*b[m][n]; 15 } /* ↑*(mat+col*r+c)でmat[r][c]となる */ 38 /* begin : calc p[l][n] */ 26 b[0][0]= 6; b[0][1]= 7; b[0][2]= 8; b[0][3]= 9; 27 b[1][0]=10; b[1][1]=11; b[1][2]=12; b[1][3]=13; 28 b[2][0]=14; b[2][1]=15; b[2][2]=16; b[2][3]=17; 44 /* end : calc p[l][n] */ 40 for(m=0; m<M; m++){ 10 void print_matrix(double *mat, int row, int col){ 39 double sum = 0.0; 2 (LxM 行列)×(MxN 行列) --> (LxN 行列) の計算 */ 43 p[l][n] = sum; 24 a[0][0]= 0; a[0][1]= 1; a[0][2]= 2; 25 a[1][0]= 3; a[1][1]= 4; a[1][2]= 5; 21 double a[L][M], b[M][N], p[L][N]; 13 for(c=0; c<col; c++){ 37 for(n=0; n<N; n++){ 35 /* begin : product, p=a*b */ 47 /* end : product, p=a*b */ 16 printf("\n"); 42 } 30 printf("matrix a=\n"); 31 print_matrix(a, L, M); 32 printf("matrix b=\n"); 33 print_matrix(b, M, N); 49 printf("matrix s=\n"); 50 print_matrix(p, L, N); 12 for(r=0; r<row; r++){ 36 for(l=0; l<L; l++){ 22 int l, m, n; 45 } 11 int r, c; 1 /* pro.c 行列の乗算 8 #include <stdio.h> 17 } 20 void main(){ 46 } 4 #define L 2 5 #define M 3 6 #define N 4 18 } 3 7 9 19 23 29 34 48 51 } pro.c
C言語
C言語:変数の宣言と利用 変数の宣言 int i; double d; i = 3; d = 5.7; printf("i=%d, d=%lf\n", i, d); “ d ”という名前の 浮動小数点型変数を宣言. 変数 i に整数 3 を代入. 以後, i には 3 が入っている. プログラム 実行結果 i=3, d=5.700000
C言語:for文による繰り返し for文 int i; for(i=0; i<3; i++){ printf("Hello,World!\n"); } printf("i=%d\n", i); 実行結果 Hello,World! i=0 i=1 i=2 プログラム
C言語:配列の宣言と使用 配列 int型が3個の配列. data[0]~data[2] が使用可能. int data[3]; int i; for(i=0; i<3; i++){ printf("data[%d]", i); printf("=%d\n", data[i]); } "0から始めて,3未満" でfor文を使うと やりやすい. data[0]=3 data[1]=4 data[2]=5 実行結果 プログラム
C言語:2次元配列 int型が2×3=6個の配列. data[0][0]~data[2][1] が使用可能. 「長さ2個の配列」が3個. (長さ3の配列が2個でない) int data[3][2]; int i, j; data[0][0] = 3; data[0][1] = 4; data[1][0] = 5; data[1][1] = 6; data[2][0] = 7; data[2][1] = 8; for(i=0; i<3; i++){ for(j=0; j<2; j++){ printf("data[%d][%d]", i, j); printf("=%d\n", data[i][j]); } data[0][0]=3 data[0][1]=4 data[1][0]=5 data[1][1]=6 data[2][0]=7 data[2][1]=8 プログラム 実行結果
練習 A 3行4列の行列を記述せよ.要素は全て3. 5行7列の行列 と 7行8列の行列 の積は,何行何列の行列となるか? 下記の行列の乗算の答えを求めよ.
解答 A 5行8列