• 検索結果がありません。

計算機言語 II 第 10 回 分割コンパイル 逆行列の計算

N/A
N/A
Protected

Academic year: 2021

シェア "計算機言語 II 第 10 回 分割コンパイル 逆行列の計算"

Copied!
4
0
0

読み込み中.... (全文を見る)

全文

(1)

計算機言語

II

10

回 分割コンパイル 逆行列の計算

http://www.math.u-ryukyu.ac.jp/~suga/gengo/2018-2/11.pdf

1

分割コンパイル

Cではいくつかに分割したソースコードを使って, ひとつのプログラムを作成することができます. コンパ イルの方法は単純で,file1.c, file2.c, ...から1つのプログラムを作るには,

cc file1.c file2.c ...

と順番にファイル名を並べるだけです.

これまで利用してきたライブラリ関数は,多くの場合, 1つのファイルに1つの関数だけが書かれていて, れをまとめたものです.

#include <stdio.h>のようなヘッダファイルの読み込みは,分割コンパイルの別の仕組みです. これは, コンパイル時に別のファイルを取り込むという操作をしています. 上のコマンドで複数ファイルを指定した場 合は,それぞれのファイルをコンパイルして機械語ファイルを作った後, 最後にそれをまとめます.

上の2つの仕組みの使い分けですが,基本的に,ヘッダファイルには cppが扱うマクロ置換や,様々なコン パイル時の定義および関数のプロトタイプ宣言を書き, Cのソースにはプログラム本体を書きます.

2

前回の

matutil.c

をライブラリ的に使う

前回,奥村さんのGitHubからmatutil.c を取り込んで,実行しました. このソースにあるmain()以外の 関数は, 線形代数(行列)をプログラムする上で便利な関数が多く記述されています. これをライブラリ的に使 うようにします.

このような際には, ディレクトリ(フォルダ)を作って, そこで作業するのが通常です. 適当な場所に, 例え

matrixというディレクトリを作り,そこに workingディレクトリを移動します.

Bash3-2$ mkdir matrix Bash3-2$ cd matrix

このフォルダに,matutil.hというヘッダファイルと,matutil.cというCのソースを作ります.

matutil.h, matutil.cで利用するマクロ置換と記述する関数のプロトタイプ宣言を書きます. 次のよ うな内容になります.https://github.com/okumuralab/algo-c/blob/master/src/matutil.cをダウン ロードして適当に編集するのが早道です.

1

(2)

/***********************************************************

matutil.h: Header file for matutil.c

***********************************************************/

#ifndef MATUTIL

#define MATUTIL

#endif

#ifndef SCALAR

#define SCALAR double

#endif

typedef SCALAR *vector, **matrix;

void error(char *message); /* ここからが関数のプロトタイプ宣言 */

vector newvec(int n);

matrix newmat(int nrow, int ncol);

vector new_vector(int n);

matrix new_matrix(int nrow, int ncol);

void free_vector(vector v);

void free_matrix(matrix a);

double innerproduct(int n, vector u, vector v);

void vecprint(vector v, int n, int perline, char *format);

void matprint(matrix a, int ncol, int perline, char *format);

次にmatutil.cを書きます. 上のヘッダファイルがあるので,matutil.hは次のようになります. やはり, 上でダウンロードしたファイルを編集(一部の追加と不要な部分の削除)します. (matutil.cのソース(の一 )は次頁)

最後に,これを次のコマンドでコンパイルしオブジェクトファイル(機械語命令からなるファイル)を作成し ます. 次のコマンドで,matutil.oというファイルができます.

Bash3-2$ cc -c matutil.c

このようにしておくと,matutil.cで記述された関数を利用するソースを書くには,ソースコードの初めの 方にに#include "matutil.h",matutil.hを読み込んでおくだけです. #includeでファイルを読み込む には,ファイルまでのパス名を指定します. < >の中にあるファイルは,コンパイラ処理系が標準的にに指定し たところにあるファイル, Linuxだと/usr/includeにあるファイルを読み込みます.

matutil.oにある関数を用いたプログラムをコンパイルには, 次のようにタイプすれば大丈夫です.

Bash3-2$ cc hohohoge.c matutil.o

2

(3)

/***********************************************************

matutil.c -- 行列

***********************************************************/

/* 行列操作の小道具集 */

#include <stdio.h>

#include <stdlib.h>

#include "matutil.h" /* この行が付け加わる */

void error(char *message) {

fprintf(stderr, "\n%s\n", message); exit(1);

}

vector newvec(int n) {

return malloc(sizeof(SCALAR) * n);

}

長いので途中は省略するが, 最初の関数 error から下の関数 matprint まではそのまま利用して, それ以降は全部削除する.

void matprint(matrix a, int ncol, int perline, char *format) {

int i;

for (i = 0; a[i] != NULL; i++) {

vecprint(a[i], ncol, perline, format);

if (ncol > perline){

printf("\n");

} } }

3 Gauss–Jordan

法による逆行列の計算

今回も奥村さんの著書を利用します.

https://github.com/okumuralab/algo-c/blob/master/src/gjmatinv.c

3

(4)

を今作ったmatrixというディレクトリにダウンロードしてください.

線形代数で学んだ掃き出し法による逆行列の計算は, プログラムの世界ではGauss – Jordan法と呼ばれて いるようです. アルゴリズムはホワイトボードで説明します.

このプログラムでは,メモリの節約のため,元あった行列に逆行列を代入する形で作られています. このよう に元の行列を利用するか,別の行列を用意して逆行列をそこに代入するかは, どのようなプログラムを組むか で変わってきますので,ここではそこを問題にしません.

コンパイルの方法

前節で, matutil.cを書き換えましたし,matutil.oを作成しました. 奥村さんのソースでは,matutil.c を読み込むという#include文がありますが,上の書き換えの結果,この手は使えません.

前節で述べたことを応用するには,gjmatinv.cの初めの方の#include "matutil.c”を次の2行に変更し ます(元々の matutil.cでは,stdio.hを取り込んでいたが,上で変更した時にこれは外した.

#include "matutil.h"

#include <stdio.h>

コンパイルは,数学関数ライブラリを使うのでオプション-lmつけて次のようにします. Bash3-2$ cc gjmatinv.c matutil.o -lm

matutil.cの関数はすでにコンパイルされているので, コンパイルの時間が短縮されます. PCの速度が速い ので,このくらいのプログラムでは実感できませんが,大きなソフトウェア開発では,「無駄なコンパイルをし ない」というのは, 重要になります.

レポート問題: 締め切り 18()

1. gjmatinv.c を変更して,入力処理を付け加えて, 乱数発生させた行列ではなく, 入力した行列の逆行列

を表示するプログラムを書け(誤差計算等の無駄な処理は取り除くこと. 入力は, (1,1)成分, (1, 2)成分 1つづつするように実装するのが易しいと思う.) 件名: report11-1.

テキストの置き場所: ftp://ftp.math.u-ryukyu.ac.jp/pub/gengo/2018-2/

4

参照

関連したドキュメント

これはつまり十進法ではなく、一進法を用いて自然数を表記するということである。とは いえ数が大きくなると見にくくなるので、.. 0, 1,

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計

、肩 かた 深 ふかさ を掛け合わせて、ある定数で 割り、積石数を算出する近似計算法が 使われるようになりました。この定数は船

ダウンロードした書類は、 「MSP ゴシック、11ポイント」で記入で きるようになっています。字数制限がある書類は枠を広げず入力してく

上であることの確認書 1式 必須 ○ 中小企業等の所有が二分の一以上であることを確認 する様式です。. 所有等割合計算書

の繰返しになるのでここでは省略する︒ 列記されている

いてもらう権利﹂に関するものである︒また︑多数意見は本件の争点を歪曲した︒というのは︑第一に︑多数意見は

前掲 11‑1 表に候補者への言及行数の全言及行数に対する割合 ( 1 0 0 分 率)が掲載されている。