プログラミング論 I 行列の演算 http://www.ns.kogakuin.ac.jp/~ct13140/Prog.

Slides:



Advertisements
Similar presentations
C 言語講座第 5 回 構造体. 構造体とは ... 異なる型の値をまとめて新しい型とする 機能がある . つまり , 複数の変数を 1 つのまとまりにできる . 配列と違って同じ型でデータをまとめるのではな く違った型のデータをまとめられる .
Advertisements

1 第5回 配列. 2 今回の目標 マクロ定義の効果を理解する。 1次元配列を理解する。 2次元配列を理解する。 ☆2 × 2の行列の行列式を求めるプログラ ムを作成する.
1 例題 ex3b ( 配列 ) 科学科プログラミング. 2 例題 : ex3b  以下の 3 つについて例題を進める ステップ 1 :配列 ステップ 2 :最小と最大 ステップ 3 :文字型の配列.
配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
コンピュータープログラミング(C言語)(2) 1.文字列出力と四則演算 (復習) 2.関数と分割コンパイル
コンピュータープログラミング(C言語)(2) 1.文字列出力と四則演算 (復習) 2.関数と分割コンパイル
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
第13回構造体.
演習00-0 “Hello,world![改行]”を表示するプログラムを作成せよ. 1 1.
データ構造とアルゴリズム 第10回 mallocとfree
基礎プログラミングおよび演習 第9回
プログラミング論 I 講義,テスト C言語復習
第2回ネットワークプログラミング 中村 修.
基礎プログラミングおよび演習 第8回.
プログラミング演習(2組) 第12回
基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習)
問題 1 フィボナッチ数列 xn は次で定義される。
IT入門B2 ー 連立一次方程式 ー.
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
C言語講座 第3回 ポインタ、配列.
プログラミング演習 バージョン1 担当教員:綴木 馴.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング2 関数
プログラミング論 I 2008年07月03日 2008年07月10日 2008年7月11日 関数,再帰
プログラミング論 I 2008年5月22日 講義概要 C言語復習
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング序論 2. n人のインディアン.
高度プログラミング演習 (03).
前回の練習問題.
indentについて forやifの「中身」を右に寄せる. forやifの「外枠」は右に寄せない. int x; x = 3;
第7回 プログラミングⅡ 第7回
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
コンピュータープログラミング(C言語)(2) 1.文字列出力と四則演算 (復習) 2.関数と分割コンパイル
高度プログラミング演習 (05).
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
C言語 はじめに 2016年 吉田研究室.
プログラミング論 I 2008年07月03日 関数,再帰
地域情報学 C言語プログラミング 第2回 変数・配列、型変換、入力 2017年10月20日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
第13回 ポインタ 1 1.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング論 ポインタ
C言語,ソースファイルの作成,コンパイル,実行
C言語復習 来週もこの資料を持参してください.
復習 breakとcontinueの違い int i; for (i = 1; i <= 100; i++) { ・・・処理1・・・・
精密工学科プログラミング基礎 第7回資料 (11/27実施)
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
変数を一度にたくさん宣言するよ! それだけじゃないよ!
地域情報学 C言語プログラミング 第3回 入力、if文、for文 2016年11月25日
ループだよ!難しいよ! 第5章 while(ループ);.
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
精密工学科プログラミング基礎Ⅱ 第2回資料 今回の授業で習得してほしいこと: 配列の使い方 (今回は1次元,次回は2次元をやります.)
地域情報学 C言語プログラミング 第3回 入力、if文、for文 2017年11月1日
プログラミング入門2 第5回 配列 変数宣言、初期化について
第4回 配列.
第2章 数値の入力と変数 scanfと変数をやります.
岩村雅一 知能情報工学演習I 第13回(後半第7回) 岩村雅一
第5回 配列.
プログラミング演習I 補講用課題
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
Presentation transcript:

プログラミング論 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列