たにちゅーの思惑|谷口忠大Home Page(たにちゅー・どっと・こむ)

LECTURE 講義・技術関連情報|谷口忠大Home Page(たにちゅー・どっと・こむ)

たにちゅーの思惑|谷口忠大Home Page(たにちゅー・どっと・こむ)

LECTURE 講義・技術関連情報|谷口忠大Home Page(たにちゅー・どっと・こむ)

たにちゅーの思惑|谷口忠大Home Page(たにちゅー・どっと・こむ)

LECTURE 講義・技術関連情報|谷口忠大Home Page(たにちゅー・どっと・こむ)

HOME  > H21 プログラミング演習2 第12週~第14週 木構造

H21 プログラミング演習2 第12週~第14週 木構造

2010-01-08 (fri)|カテゴリー:コメント:0

課題 12-1

——————————————–

  1. 1.まず,レジュメの通り struct node の宣言をする.
  2. 2.次に new_node 関数を作る.
    • 関数内でメモリ確保(malloc)をする.
    • 要素の値はkey を入れる.
    • そのメモリ領域を指すポインタをreturnで返す.
  3. 3.必要な数の構造体ポインタを宣言し,それぞれにnew_nodeで値を割り当てて,その後に,parent, right, leftなどのポインタに代入することで,繋げていく.
  4. 4.最後にprint_treeする.

———————————————

 

まず,書かれている通りの宣言を書いてしまおう.

#include <stdio.h>
#include <stdlib.h>

//nodeの構造体を宣言する(レジュメの通り)
struct node {
    int key;
    struct node *parent, *left, *right;
};

// 問題は↓を作れと言われている.ことと殆ど同義
struct node *new_node(int key)
{

  //関数内で新たなノードに相当するメモリ領域を確保する.
  struct node *p = malloc(sizeof(struct node));  //mallocで

  /* あとこの関数の中でやることは   

  node *p の値 key に 引数の値 key を代入して

 parent, left, right にをリセットすること. 

 つまり,NULL値を放り込むことだ.

 最終的に関数の戻り値の型は struct node *  (node構造体型のポインタ) なので

 p を返してあげればいいのです. */

}

main()
{
    struct node *root, *n[10];

    n[0] = new_node(4);
   //という感じで10個のnodeを作って

   /*

    ここにいろいろコードを書く

   */

   //まず root の値を何かに設定.たとえば, root = n[5]; のように.

  //下のように,ノードをつないで行けばできあがり.

    n[0]->left = new_node(0);
    n[0]->right = n[1];
    n[0]->parent = n[2];

    /*

続きをいろいろ書く.

    */   

  // 最後に全体を出力.
  print_tree(root);
}

 

 

 

課題12-2

この問題は木構造というか二分探索木の問題です.

insert関数を作りましょうと言う問題です.

以下,データ構造とアルゴリズムの資料より

 

image

insertでは,ノードの値と比較していき,ノードの値より大きければ右,小さければ左というふうに,動いていく.

image

image

——————————————-

実装

int insert(int x, struct node *p)
{

    /* 引数のnode *p から始めて,そのノードの値と x の値を比べて

  大きければ p を p->ritght に進め,

  小さければ p を p->left に進めます.

  もし同じ値があれば, return 0 で,同じ値があったので挿入しなかったと返し,

  key が 0 のノード(外点)を見つけたら,そこに値 x を入れましょう.

    新たなノードには外点が無くなるので, その左右には new_node(0) をしておきます.

  挿入に成功したら, return 1; をしておきましょう.

    /*

}

 

main()

の中はよしなにつくってください.

2009年度 プログラミング演習2  鬼門 課題8-4を解く

2010-01-07 (thu)|カテゴリー:コメント:1

以下の三段階で解けばいいでしょう.

決して一気に解こうとせずに,各段階で出来ているか確認して下さい.

(1) データ構造として 構造体の配列を用意する.

(2) ファイルから文字を数え上げる.

(3) 配列の二つの要素を入れ替える関数を作る.

(4) ヒープソートを作成する.

 

(1) データ構造として 構造体の配列を用意する.

標準的には

 

#define MAX_CHAR 1000

typedef struct _chdata {
    int        count;
    char    name;
} CHDATA;

CHDATA chdata[MAX_CHAR]; //構造体の配列で作る場合。

int     n_char;    /* 文字の種類 */
int     total_char;    /* 総文字数 */

 

のように確保すればよいでしょう.

 

 

(2) ファイルから文字を数え上げる.

新しい文字が出てくる旅に,使っていない配列の要素 chdata[n_char] のnameに

新しい文字を割り当て,count を1にします.

その後,同じ文字が出てくる度に count を1増やして行きましょう.

 

この時,大文字を小文字に替えることや 改行(\n),tab(\t)などをスペースに

替えるコトなどをわすれずに

 

(3) 配列の二つの要素を入れ替える関数を作る.

 

chdata[i] と chdata[k] を入れ替える swap関数を作りましょう.

 

(4) ヒープソートを作成する.

データ構造とアルゴリズムでのヒープの復習をした上で,

ヒープの一次元配列による表現 を理解しましょう (教科書p.136など)

その上でヒープソートの動きを理解し (こちらのページも参照

 

その上で,教科書 p.137 のソースコードをホボ写しましょう.

 

このソースコードを一生懸命読解する!! ←ここ山場!!

 

これが何をやっているか理解出来れば,

それを今回のプログラムに合うように,修正してあげれば,

8-4が達成されます.

 

 

追記:

プログラムを進めるうえで, 配列の状況を常にチェックするようにした方が良いので

現在のデータを出力する関数

void print_all_data(){
    for(i=0;i<n_char;i++){
        printf(”%c  %d\n”,chdata[i].name,chdata[i].count);
    }
}

のようなものを先に作っておくとよいでしょう.

H20年度の担当講義

2009-07-05 (sun)|カテゴリー:コメント:0

【H20前期】

  • プログラミング演習1
  • 知能情報学実験1 (信号処理)

 

【H20 後期】

プログラミング演習3 自由課題 アイデア集

2009-07-05 (sun)|カテゴリー:コメント:0

2009/07/02 の時間中にホワイトボードで教員・TA/ESでブレストした

アイデア集です.

参考までに・・・・

 

ゲーム
トランプ
大富豪
7並べ
ばば抜き
ポーカー
麻雀
どんじゃら
RPG
ダンジョン
絵のないドラクエ
ゲームブック
迷路自動生成
アスキーアートで絵を描く
バトルシーンのみ
マインスイーパ
シミュレーション
戦国もの?
シムシティ
シムアント
コンビニ経営
AOE
人工生命
子育てシミュレーション
すごろく
人生ゲーム
じゃんけん
あっちむいてホイ
OXゲーム
丁半
五目並べ
四目並べ
オセロ
戦略を学習するAI
機械学習
知能情報っぽい話
GA
強化学習
ニューラルネットワーク
SOM
フラクタル生成
フーリエ展開

ユーティリティソフト
メーラー
電卓
TODO管理
スケジュール帳
レシピ自動生成
カレンダー
リモコン
小遣い帳

WEB掲示板
アクセスカウンター
数字の3の倍数をアホに変換するソフト
数値計算
数値積分
ボールの軌道をシミュレーション
方程式を解く

シューティング

WindowsでのWiiリモコンの開発

2009-06-06 (sat)|カテゴリー:コメント:0

WindowsでのWiiリモコンライブラリ使用方法の説明を行います.

wiilib.hlibWii.lib(Releaseビルド)又はlibWiid.lib(Debugビルド)を使います.

プロジェクトを作成してください.「Win32コンソール アプリケーション」を選び,プロジェクトを作成してください.作成できたらまずプロジェクトのプロパティを開き,ライブラリをマルチスレッド(/MT)又はマルチスレッド デバッグ(/MTd)に変更してください.

そして,プロジェクトの同じディレクトリにwiilib.hとlibWii.libとlibWiid.libを置いてください.

 

下記に使用例を載せておきます.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

// Wii_sample.cpp : コンソールアプリケーションのエントリポイントを定義します。

#include <stdio.h>

#include <windows.h>

#include “wiilib.h”

#ifdef _DEBUG

#pragma comment(lib,”libWiid.lib”)

#else

#pragma comment(lib,”libWii.lib”)

#endif

int main(int argc, char* argv[])

{

WiiLib wii;

double x,y,z;

if(!wii.initWii()){//Wiiリモコンを認識&初期化

return 0;

}

while(1){

Sleep(100);

x = wii.getWiiAngle(Wii_X_AXIS); //加速度センサX軸の情報を取得

y = wii.getWiiAngle(Wii_Y_AXIS); //加速度センサY軸の情報を取得

z = wii.getWiiAngle(Wii_Z_AXIS); //加速度センサZ軸の情報を取得

printf(”x:%lf y:%lf z:%lfn”,x,y,z);

if(wii.getWiiState(Wii_BUTTON_B)){//Bボタンが押されたかどうか?

printf(”キャリブレーションn”);

wii.setWiiCalibrate(); //加速度センサを現在の位置で初期化

wii.setWiiRumble(Wii_Rumble_ON); //振動させる

Sleep(50); //振動させる期間スリープする必要あり

wii.setWiiRumble(Wii_Rumble_OFF); //振動をやめる

}

}

return 0;

}

まずWiiLibクラスを宣言したら,initWiiを呼び出してWiiリモコンを認識させてください.Wiiリモコンの認識に成功したらbool変数trueが帰ってきます.

初期化後に関数getWiiState使うとどのボタンが押されたか?がわかります.

引数に列挙体WiiStateをとり,これでボタンや加速度,IRセンサを指定します.

また,getWiiAngleを使うとWiiリモコンの加速度センサの値がラジアンでわかります.

各メンバ関数の説明

// Wiiリモコンを探して接続し,初期化を行う

bool initWii(WiiInitType wit = Wii_ACCEL);

// Wiiリモコンとの通信を切る

void closeWii(void);

// どのボタンから入力があったかを得る

int getWiiState(WiiState Key);

// Wiiリモコンの傾きをラジアンで得る

double getWiiAngle(WiiState Axis);

// 現在のWiiリモコンの傾きを基点とする

void setWiiCalibrate(void);

//指定した LEDを点灯させる

static void setWiiLED(unsigned char LED_ID);

// Wiiリモコンを振動させる

void setWiiRumble(WiiRumble wr);

// Wiiリモコンが使えるかどうかを確認する

int isWiiEnable(void);

 

BlutoothWiiリモコンとの接続について

今回,学校の生協で販売しているSANWA SUPPLY MM-BTUD11というBluetoothアダプタを用いて動作実験しました.下記は一例です.

clip_image002

「新しい接続」をクリックする

clip_image004

「エクスプレスモード(おすすめ)」

を選び次へ進む.その時にWiiリモコンの1ボタンと2ボタンを同時押しして,青のLEDランプを点滅した状態にしておく.

clip_image006

Wiiリモコンを発見出来たら選択して次へすすむ.

clip_image008

最後にこのような画面になり,接続できれば完了です.

この状態で,サンプルプログラムを動かしてみてください.

 

サンプルプログラムのダウンロード

Wii_sample.lzh

OpneGLの使い方


このページでは,OpenGLの使い方を学ぶ紹介をします.

1.OpenGLの基本について

基本については下記のページを参考にしてください.

コンピュータグラフィックス特論Ⅱ (大学院講義)

OpenGLを一から使うのはなかなか大変ですが, このページに紹介されているようにOpenGL & GLUTというライブラリを使えば,カナリ簡単に格好良い三次元グラフィックを使うことができます.

また,マウス入力やキーボード入力の関数も用意されていますので,簡単なゲームなどは作れるでしょう.

2.GLUTでロボットを表現してみる

知能ロボット関係の研究では,とりあえずOpenGLでロボットの形を作ってみたいということも有るでしょう.

そんな場合は,とりあえず以下のページのサンプルコードにトライしてください.

http://www.wakhok.ac.jp/~momma/lec2000/Graphics_Programming/6/lecture6.html

これをいじっていくことで徐々に狙いの形に持って行けると思います.

3.その他の参考ページ

http://verygood.aid.design.kyushu-u.ac.jp/opengl2005/material.html

http://verygood.aid.design.kyushu-u.ac.jp/opengl/3d.html

http://d.hatena.ne.jp/naf/searchdiary?word=glut

http://homepage3.nifty.com/tosikazu/pch/pchREP7.html

http://odalab.spub.chitose.ac.jp/~oda/lang/opengl_obj.html

CPPLapackの導入


このページでは,CPPLAPACKの使い方を学ぶ紹介をします.

1.CPPLAPACKについて

cpplapackはC++で利用できる行列演算ライブラリのラッパーです.

もともとLapackはFortranで開発された行列演算ライブラリですが,CLapackとしてC言語から利用できるようになりました.

これをC++のクラスやメモリ管理の機構を加え,グッと利便性を増したのがcpplapackです.

オペレータ演算子のオーバーロードや,クラス実装により 数学的な記述がかのうになりました.

つまり,行列の足し算が

A = B + C ;

で済むという・・・.さらに,転置は

At = t(A) ;

で済みます.

少しでもforループを減らしたい私としては,また,若い頃からオブジェクト指向にドクされた私としては最早,これなしにはやっていけないのです.

2.基本参考サイト

以下のサイトで基本を学んでください.

CPPLapackドキュメント日本語版

一応,日本語版ドキュメントの本家

CPPLapackチュートリアル

上島氏による,チュートリアルサイト.基本はまず,このチュートリアルに従って,やってみることで身につきます.

CPPLapack Documentation

総本山? ここにClassのメンバー関数などが全て書いてあり,どんな関数があるのか知りたいときはここにいって,Class Listをみます.

3.インストール(使用できるようになるまで: Linux編)

まず,Linuxにlapackのライブラリを入れるひつようがあります.

Synapticパッケージマネージャを立ち上げて,lapackで検索してみてください.

Vine linux 4.2 なら lapack が, Ubuntu 7 なら例えばlapack3 が引っかかると思います.

あと, -devというのがついたやつも出てきたら,それもチェックしてインストールしちゃいましょう.

これで,ライブラリ自体は入ってくれます.Syapticの無い人は

apt-get install lapack

とかで行けるらしい.

次に,CPPLapackを入れます.この入れ方はCPPLapackチュートリアルに書いてあるのですが,一部間違っているので,再度書いておきます(引用).

  1. mkdir ~/local,mkdir ~local/libと入力し,ディレクトリ~/local/libを作成する.
  2. cd ~/local/libと入力する.
  3. http://sourceforge.net/projects/cpplapack/からCPPLapackの最新版cpplapack-XXXX_XX_XX.tar.gzをダウンロードする.
  4. tar xzf cpplapack-XXXX_XX_XX.tar.gzと入力し,CPPLapackを展開する.
  5. ln -s cpplapack-XXXX_XX_XX cpplapackと入力し,シンボリックリンクを作成する.

なぜか,チュートリアルでは5のln が luになってました.

この上で,プログラム中で

#include <cpplapack.h>

と呼び出せば,大概いけます.

4.主に使うもの

基本的に使うクラスは

dcovector

double の column (列) vector ということ.普通の列ベクトル.

drovector

double の row (行) vectorということ.普通の行ベクトル.時々使う.

dgematrix

double の general (一般) matrix(行列)ということ.非常によく使う.

使い方はとりあえず, CPPLapackチュートリアルで体感してください.

5.うまくいかない

Vine 4.2の場合,上記だけでは

/usr/bin/ld: cannot find -llapack

と,怒られる可能性があります.

これは,Vine でインストールした laplack, blas, g2cのlibファイルの名前が違うからの可能性があります.

su になって

> updatedb

として,

> locate liblapack

で,libの位置を特定

/usr/lib/liblapack.so.3.1.1

こんな場所を言ってくるので,これを /usr/lib/liblapack.so にコピーするなり,シンボリックリンクはるなりすればいけるはず.

同様のことが, blas と g2c にも言えるので,同じようにすること.

CPPLAPACKの導入法

CPPLAPACKの導入法

CPPLapackは BLAS および LAPACK の C++ クラスラッパーです.

CPPlapack自体はヘッダーのみで構成されていて,CPPlapackが内部でlapackやatlasライブラリを呼び出すことによってユーザが簡単にC++でlapackやatlasライブラリを使用できるようにしたものです.

http://cpplapack.sourceforge.net/doc/main_page/Japanese.html

このURLが参考となるかもしれません.

~Linux編~

1.ライブラリのインストール

Synaptic(Ubuntuなら)パッケージ・マネージャでlapackを検索して適切なものをインストールしてください.(下記はVine Linux 4.2の一例)

clip_image002[7]

また,コマンドからインストールする方法は,

clip_image003

としてroot権限になります(この作業は各Linuxとも共通です).Ubuntuの場合は

clip_image004

としなければならないかもしれません.(ローカルユーザの場合)

rootユーザになってから

Ubuntuやdebianなどの環境なら

clip_image005

でインストールをしてください.最新のUbuntu8.10では,パッケージ名がliblapack3gfという名前に変わっているので注意してください.

また,Fedoraなどでは

clip_image006

でインストールができます.また,OS等によりパッケージ名は変わるので適宜検索等を行い調べて適切なものをインストールしてください.

ここで,CPPLapackのプロジェクトページよりヘッダーのダウンロードをしましょう.

http://sourceforge.net/projects/cpplapack/

よりcpplapack-2005_03_25.tar.gzをダウンロードします.

clip_image007

このようにコマンドで直接ダウンロードしてもかまいません.

そこで,できたcpplapackを解凍します.

clip_image008

そして,

clip_image009

として解凍したフォルダに入りましょう.

すると中には

clip_image010

とあると思いますので,ここでrootユーザとなって/usr/local/以下にインストールしましょう.

clip_image011

このようにして/usr/local/includeの中にcpplapackのヘッダーをコピーしてください.このディレクトリにコピーすることによりコンパイラはヘッダーファイルを見つけることが可能となります.

また,rpmコマンドが使える環境(Fedora, Vine(Ubuntuもインストールしているなら))ならcpplapackのプロジェクトページよりcpplapackのrpmパッケージをダウンロードしてインストールした方がより簡単に済みます.

clip_image012

rootになってからrpmコマンドでインストールします.(すでにrootユーザの場合suコマンドは不要)

clip_image013

この場合cpplapackが/usr/include下に自動的にインストールされるので標準ライブラリを使う時と同様に扱え便利です.(コンパイル時にディレクトリを指定する特殊な操作が不要ということ)

2.サンプルプログラムの実行

では,準備ができたらサンプルを作成してコンパイルを行ってみましょう.

ホームディレクトリにtest.cというファイルを用意し

1

2

3

4

5

6

7

8

9

10

11

#include <cpplapack.h>

int main()

{

CPPL::dgematrix A(2,3);

A(0,0)=1; A(0,1)=7; A(0,2)=5;

A(1,0)=3; A(1,1)=4; A(1,2)=6;

std::cout << A << std::endl;

return 0;

}

と入力してください.コンパイルの方法は

clip_image014

とすると,ホームディレクトリにtestが作成され

clip_image015

とこのような結果となればインストールは成功です.

ここでCPPL::i()は逆行列を求める関数ですが,この関数を用いる場合はコンパイル時にライブラリをリンクする必要があります.

1

2

3

4

5

6

7

8

9

10

11

12

13

#include <cpplapack.h>

int main()

{

CPPL::dgematrix A(2,2);

A(0,0)=1; A(0,1)=7;

A(1,0)=3; A(1,1)=4;

std::cout << A << std::endl;

CPPL::dgematrix B = CPPL::i(A);

std::cout << B << std::endl;

return 0;

}

このようなAの逆行列を求める場合は

clip_image016

としてコンパイルする必要があります.(-llapackで/usr/libディレクトリに存在するliblapack.*** (***は環境により異なる)というライブラリをリンクするという意味です.)

clip_image019

3.基本的な使用例

cpplapackで主に使うクラス,変数はdgematrix(一般行列),drovector(行ベクトル),dcovector(列ベクトル)でしょう.これらは四則演算等の演算子がそのまま使えます.(演算子オーバーロードされている)

http://cpplapack.sourceforge.net/doc/html/index.html

このページに詳しく書かれているので,どのようなメンバ関数があるのかは自身で調べてください.

サンプルとして行,列ベクトルのそれぞれの掛け算と逆行列,逆行列,転置を載せておきます.参考にしてください.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

#include <iostream>

#include <cpplapack.h>

int main()

{

CPPL::dgematrix A,iA,tA;//一般行列

CPPL::drovector R(2);//行ベクトル

CPPL::dcovector C(2);//列ベクトル

double S;

R(0) = 3; R(1) = 4;

C(0) = 5; C(1) = 6;

A = C*R;//列x行

S = R*C;//行x列

iA = CPPL::i(A);//逆行列

tA = CPPL::t(A);//転置

std::cout <<”R n” << R << std::endl;

std::cout <<”C n”<< C << std::endl;

std::cout <<”A n”<< A << std::endl;

std::cout <<”S n”<< S << std::endl;

std::cout <<”iA n”<< iA << std::endl;

std::cout <<”tA n”<< tA << std::endl;

return 0;

}

実行例

clip_image021

4.分割コンパイル方法

(複数のソースコードファイルに分けたプログラムのビルド方法)

プログラムを書いていくとコードが非常に長くなり,ある特定の機能を持つモジュールを特定のファイルに分割してコンパイルしたい場合があります.そのようなときに役立つのがMakefileです.書き方はいろいろありますが,一例を載せておきます.

clip_image022

このような書き方でsample.cppをmain関数の存在するメインファイルとして,cpplapack_plus.h,cpplapack_plus.cppが新たに作ったモジュールとしてファイルを分割してコンパイルすることが可能です.

コンパイルするときはmakeとすれば,

clip_image024

このようにコンパイル可能です.

また,新たにファイル(例えばadd.cpp と add.hというファイルを追加するとする)を作成しMakefileへと追加する場合はMakefileの内容を

clip_image025

のように変更すれば,追加することができます.(赤色の部分が変更点)

~Windows編~

まず,CPPLAPACKのヘッダーをダウンロードしてください.

http://sourceforge.net/project/showfiles.php?group_id=78519&package_id=87720&release_id=315440

よりcpplapack-2005_03_25.tar.gzをダウンロードして解凍してください.

適当な解凍ソフトで解凍したのち,その得られたcpplapack-2005_03_25とうフォルダをC:に置いてください.

次にライブラリの準備をします.

ライブラリを

http://www.netlib.org/clapack/index.html

のサイトからCLAPACK-3.1.1-VisualStudio.zip

をダウンロードして,解凍したフォルダCLAPACK-3.1.1-VisualStudio

を同様にC:直下に置いてください.

C:直下に図のようにおけたらVisualStudioを起動しましょう.

VisualStudioを起動したら

clip_image027

メニューのツールよりオプションを選択してください.

clip_image029

オプションを開いたら,左のメニューの「プロジェクトおよびソリューション」の中の「VC++ ディレクトリ」を選び,ディレクトリを表示するプロジェクトのコンボボックスの中の「インクルードファイル」を選択します.

そしてclip_image031を押して新しい行を追加し,その右側のclip_image033を押し先ほどC:直下に置いたcpplapack-2005_03_25の中のincludeファイルを選択します.

(C:cpplapack-2005_03_25includeこのディレクトリを追加します.)

同様に,コンボボックスを「ライブラリ ファイル」に変更して同じようにclip_image034を押して新しい行を追加し,

その右側のclip_image035を押し,CLAPACK-3.1.1-VisualStudioの中のLIBの中のWin32を選択します.(64bitOSならx64を選択)

(C:CLAPACK-3.1.1-VisualStudioLIBWin32このディレクトリを追加)

以上で設定は完了です.

おつかれさまでした.準備ができたらサンプルコードを書いてインストールができたかを見ましょう.

新たにVisualStudioを起動したら,プロジェクトを作成してください.

「Win32コンソール アプリケーション」を選び,プロジェクトを作成してください.作成できたらまずプロジェクトのプロパティを開き,ライブラリをマルチスレッド又はマルチスレッド デバッグに変更してください.

clip_image037

変更できたらソースにこのようにタイプしてください.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

// cpplapack_test.cpp : コンソールアプリケーションのエントリポイントを定義します。

//プリコンパイル済みヘッダーファイルを使用する(/Yu)場合はインクルード

#include “stdafx.h”

#include <cpplapack.h>

//ライブラリリンク

#ifdef WIN32

#ifdef _DEBUG

#pragma comment(lib,”f77blaswrapd.lib”)

#pragma comment(lib,”libf2cd.lib”)

#pragma comment(lib,”BLASd_nowrap.lib”)

#pragma comment(lib,”clapackd_nowrap.lib”)

#else

#pragma comment(lib,”f77blaswrap.lib”)

#pragma comment(lib,”libf2c.lib”)

#pragma comment(lib,”BLAS_nowrap.lib”)

#pragma comment(lib,”clapack_nowrap.lib”)

#endif

#endif

int main()

{

CPPL::dgematrix A(2,2);

A(0,0)=1; A(0,1)=7;

A(1,0)=3; A(1,1)=4;

std::cout << A << std::endl;

CPPL::dgematrix B = CPPL::i(A);

std::cout << B << std::endl;

return 0;

}

このようにタイプして,正常にコンパイルが通り,

clip_image039

このような結果となればOKです.お疲れ様でした.

補足説明:

8

9

10

11

12

13

14

15

16

17

18

19

20

21

//ライブラリリンク

#ifdef WIN32

#ifdef _DEBUG

#pragma comment(lib,”f77blaswrapd.lib”)

#pragma comment(lib,”libf2cd.lib”)

#pragma comment(lib,”BLASd_nowrap.lib”)

#pragma comment(lib,”clapackd_nowrap.lib”)

#else

#pragma comment(lib,”f77blaswrap.lib”)

#pragma comment(lib,”libf2c.lib”)

#pragma comment(lib,”BLAS_nowrap.lib”)

#pragma comment(lib,”clapack_nowrap.lib”)

#endif

#endif

これは,ソースコードでどのライブラリをリンクするかを指定しています.Linuxでのg++オプションの”-llapack –lblas –lf2c”に相当するものです.このこのように

#ifdef WIN32

#endif

で括っておけばソースコードをLinux環境のg++でコンパイルしても無視されるため,他環境への移行も簡単になります.また,

#ifdef _DEBUG

ではビルドの設定を指定しています.Debugモードでビルドする場合はVisualStudioで自動的に

#define _DEBUG

とマクロが定義されるために_DEBUGが有効になりビルドモードに応じて適切なライブラリがリンクされます.

~Linux編おまけ~

Lapackなどのライブラリをパッケージ・マネージャでインストールすることができない環境での構築法を書いておきます.以下かなり操作が煩雑になります.

CLAPACKとATLASというライブラリをソースコードからコンパイルしてライブラリを作成します.

まず,

http://sourceforge.net/project/showfiles.php?group_id=23725

からStable版のatlasライブラリをダウンロードします.

09/3/4時点ではatlas3.8.3.tar.gzが最新版のようです.

atlas3.8.3.tar.gzをダウンロードしたら,解凍します.

clip_image040

するとATLASというフォルダができるので,そのディレクトリに入ってATLASライブラリをコンパイルします.そこで

clip_image041

として,ATLASディレクトリの中に新たなMyObjというディレクトリを作成します.そしてMyObjディレクトリの中に入り下記のコマンドを打ちます.

clip_image042

エラーが出ずにconfigureが終わればそのまま

clip_image043

と打ち,コンパイルが完了するのを待ちます.コンパイルが完了するとMyObj以下のlib/フォルダにlibatlas.a libf77blas.a libptcblas.a libtstatlas.a libcblas.a liblapack.a libptf77blas.aというライブラリができているのを確認してください.

clip_image044

そして,このライブラリはいったんこのままにしておき,次にlapackの準備をします.

http://www.netlib.org/clapack/index.html

よりclapack.tgzをダウンロードします.
clip_image045

clip_image046

ここで先ほど作成したATRASのライブラリをこのCLAPACKフォルダにコピーします.

clip_image047

となり,コピーできたら次にCLAPACKのmake.inc.exampleを編集します.

make.inc.exampleの中の

clip_image048


clip_image049

と書き換えます.そしてmake.inc.exampleをmake.incとリネームします.

clip_image050次にCLAPACKをコンパイルします.

clip_image051

と打ち,コンパイルが正常に完了するのを待ちます.コンパイルが完了するとディレクトリの中が

clip_image052

となり,新しくlapack_LINUX.a,libcblaswr.aができているのを確認してください.

次に,順に下記のコマンドを打ち

clip_image053

clip_image054

clip_image055

clip_image056

と打っていきます.するとディレクトリは

clip_image057

のようになっていればOKです.ここで新たにliblapack.aとlibblas.aがあればOKです.また,libf2c.aはF2CLIBS/フォルダの中にあります.

それも必要なら~/libに入れておきましょう.

このliblapack.aとlibblas.aの二つのライブラリをホームディレクトリにlibフォルダを作成してその中に入れておきます.

clip_image058

ライブラリのコンパイルが完了しました.このライブラリを実際に使用するには,先のサンプルをコンパイルするときに

clip_image059

としてコンパイルしてください.お疲れ様でした.

参考にしたURL

http://www.eml.hiroshima-u.ac.jp/member/staff/tamaki/LTI-Lib/index.php?LAPACK%2BATLAS

資料作成のために研究室のscuderia(Xeon Ubuntu 2.6.22-15-generic x86_64)マシンとmondeo(Pentium4 Fedora 2.6.25.9-40.fc8 i686)でライブラリコンパイルして作成し,テストプログラムの動作を確認した.(mondeoではCPPL::t 転値が使用できなかった)

知能情報学実験:信号処理

2009-05-18 (mon)|カテゴリー:コメント:0

知能情報学実験「信号処理」受講者へ

皆さんの中には昨年度のプログラミング演習1で習われた事を「サッパリ」お忘れの方もおられるでしょう.

もちろんそれは「よろしくない」事ですが.ファイル入出力については大体期末にならい,バタバタとして身につきにくい単元でもありますので,サンプルソースを提示しておきます.課題1で「ファイル出力」,課題2以降で「ファイル入力」を用います.

講義の内容については何はともあれ←北野先生の講義情報ページをご覧下さい.

1.ファイル出力サンプルコード

たとえば,新しくdata.txtという名前のファイルを作って,そこ0~9という数字をはき出すプログラムを考えましょう.

 


#include <stdio.h> 
 
int main(){
 
	int i=0;
	//	①FILEでファイルポインタを宣言する.
	FILE *fp;
	//	②fopenで"w"か"r"か"a"か開くモードを指定し,ファイルを開く.
	fp =fopen("data.txt","w");//"w"はwrite:書き込みの意味です.
	for(i=0;i<10;i++){
		//③fprintfでファイルポインタ(開いたファイル)に書き込む
		fprintf(fp,"%d\n",i);
	}
	//④ファイルを閉じる.
	fclose(fp);
 
	return 0;
}
 
 
/*
	コードの実行結果
 
	プログラムのあるフォルダに"data.txt"ができ以下の
	データが出力されます.
 
	0
	1
	2
	3
	4
	5
	6
	7
	8
	9
 
*/



2.ファイル入力サンプルコード

つぎに上でつくったデータを読み込んで画面に表示するプログラムを作りましょう


#include <stdio.h>
 
int main(){
 
	int i=0;
	int a=0;
	//	①FILEでファイルポインタを宣言する.
	FILE *fp;
	//	②fopenで"r"と開くモードを指定し,ファイルを開く.
	//	このときちゃんと開くファイル(例えば)"data.txt"があることを確認
	fp =fopen("data.txt","r");//"r"はread書き込みの意味です.
	for(i=0;i<10;i++){
		//③fprintfでファイルポインタ(開いたファイル)に書き込む
		fscanf(fp,"%d",&a);//scanfとほとんど同じ文法なので"&"を忘れない.
		printf("%d,",a);
	}
	//④ファイルを閉じる.
	fclose(fp);
 
	return 0;
}
 
 
/*
	コードの実行結果
 
	プログラムのあるフォルダにある"data.txt"から整数aに
	データが読み込まれ,以下のデータがprintfによって出力されます.
	0,1,2,3,4,5,6,7,8,9,
 
*/


sin, cos, フーリエ変換使用時コンパイル時の注意

コンパイル時に -lm をつける必要があります.(math(数学)ライブラリーを使うと言う意味)

たとえば

> gcc test.c -o test -lm

のようにしないとエラーがでます.

H20 プログラミング演習2 第12週~第14週 講義補助資料(木構造)

2009-05-18 (mon)|カテゴリー:コメント:1

プログラミング演習2 ~第12週から第14週まで~

※ 課題12-1の実行例では、外点が0(ゼロ)として表示されています。

本課題では、 「外点のキーは0(ゼロ)とする。」 との記述が抜けています。

つまり、外点を作成する場合、

struct node *n[10]; n[i] = new_node(0);

とする必要があります。 12-1

・print_treeの使い方

根(root)のstruct nodeのポインタをrootとすると

print_tree(root);

という形で利用する.

 

・とりあえず

とりあえず,教科書p.155ページを見てください.

・structの宣言

プリントにもありますが,以下の宣言がまずはじめ.


struct node{
	int key;
	structnode *parent,*left,*right;
}


 

・とりあえず2

構造体node型の領域を確保し,要素を代入するnew_node関数を作りましょう..


struct node *new_node(int val)
{
    [struct node のポインタpを宣言,struct node相当のメモリ領域をmallocでわりあてる.]
 
    [pのメンバ変数keyに値valを割り当てる]
 
    [pのメンバ変数parent,left,rightにNULLを割り当てる]
 
    [strut node のポインタpを返す.]
}

といった作業をします.

これを作った後に

struct node *n; n = new_node(4);

のようにすれば値が4のノードを作れるわけです.

あとはこれと同様に配列なりで必要な数nodeのポインタ&メモリ領域を用意し, このparent, left, rightに適切なポインタを代入していくことで木構造を作ります.

インフォメーション



tanichuの著作

copyright © Tadahiro Taniguchi All Right Reserved.