Hebb規則に基づく連想器のいくつかの総括


授業が終わると、先生は舞台に上がってpresentationをするように要求した.そこで最も簡単なHebbルールに関するテーマを選びました.プログラミングの過程で、ニューラルネットワークに対してより多くの感性認識があっただけでなく、他の問題にもいくつかの収穫があった.ここで簡単に覚えておきます.
プログラムではマトリクスに関する操作が用いられ,matlabのマトリクス操作が強いと多くの人が言っている.ネットで調べてみると、C++からmatlabを呼び出す方法は、client-serverの形式で呼び出すか、matlabのプログラムをCOM、DLLにカプセル化して呼び出すかのどちらかです.一時的にmatlabを学ぶこれらの方法は間に合わないようで、boostライブラリに転送して、マトリクスに関連する操作があるかどうかを探します.
まずboostライブラリについてお話ししますが、機能が強く、C++への有益な補充です.このライブラリのダウンロード・コンパイル方法については、主にこのチュートリアルを参照しています.http://www.cnblogs.com/wondering/archive/2009/05/21/boost_setup.htmlそしてこの本:http://book.douban.com/subject/5276434/.ここでublasライブラリはマトリクス操作に関係しています.これにより,基本的なマトリクス回転,求逆,マトリクスマトリクス演算,ベクトルベクトル演算,およびマトリクスベクトル演算を実現できる.しかし、公式のドキュメントはあまり力がなく、例も豊富ではありません.求逆を実現するときは、Googleが他人の既成を直接見つける方法です.
今回はC++のtemplate functionメカニズムを使ってみましたが、こんな感じでした.第一に、非template classでtemplate functionを作成する場合、この方法の実装コードはヘッダファイルに書くことが望ましい.そうでなければ、他のクラスからこのtemplate functionを呼び出すと、リンクエラーLNK 2019が報告されます.理由を検索すると、テンプレートの分離をサポートしていないコンパイラもあるので、ここの議論を参考にすることができます(http://bbs.csdn.net/topics/190029153)、stackoverflowの説明「The compiler needs to have access to the entire template definition(not just the signature)in order to generate code for each instantiation of the template,so you need to move the definitions of the functions to your header.
Note: In general most C++ compilers do not easily support the separate compilation model for templates.”.ただし、このtemplate functionが本クラスの内部実行中に呼び出されると、cppファイルに書くことは実行に影響しません.
もう1つは、template functionで使用される方法で、入力タイプに要求があれば、自分で1つ実現しない限り、タイプに関係なく行うことはできません.例えば求逆の方法では,関数lu_が用いられる.factorize()は、intタイプのマトリクスを最初に入力すると、この関数が実行中にmathに呼び出されたため、常にエラーが報告される.hのsqrt関数ですが、この関数はdoubleまたはfloatタイプの変数のみを受け入れます.最後にマトリクスタイプをすべてdoubleに変えてやっとスムーズにパスしました.
ファイルの読み取りという一般的な方法をいくつか記録します.
#include <string>
#include <fstream>
void coldDish(string path){
	ifstream ifs;
	char read;
	ifs.open(path, fstream::in);
	while(ifs>>read){
		if(read == '1'){
			...
		}else if(...){
			...
		}
	}
	ifs.close();	
}

filestreamをstd::cinにドッキングする方法が見つかりました.cinもiostreamタイプですが、入力が完了したらstd::cinを復元する必要があります.そうしないと、システムエラーが発生します.
boost-ublasのいくつかについて.まず、逆行列を求めるfunctionは、まだこの中で使われている関数をよく見ていないので、使ってください.
#include<boost
umeric\ublas\matrix.hpp> #include<boost
umeric\ublas\operation.hpp> #include<boost
umeric\ublas\io.hpp> #include<boost
umeric\ublas\lu.hpp> template<class T> bool numToLet::InvertMatrix(const matrix<T>& input, matrix<T>& inverse){ using namespace boost::numeric::ublas; typedef permutation_matrix<std::size_t> pmatrix; // create a working copy of the input matrix<T> A(input); // create a permutation matrix for the LU-factorization pmatrix pm(A.size1()); // perform LU-factorization int res = lu_factorize(A,pm); if( res != 0 ) return false; // create identity matrix of "inverse" inverse.assign(identity_matrix<T>(A.size1())); // backsubstitute to get the inverse lu_substitute(A, pm, inverse); return true; }

もう1つ、coutフォーマットを制御します.
#include <iomanip>
void printee(double i){
	cout<<setiosflags(ios::right)<<setw(2)<<setprecision(2)<<i;
}

次に、matrix変数の宣言と初期化を分けて、Cのようにmain.cppをすべてパッケージするのではなく、C++(Cのように1つのmain.cppではなく)に見えるようにすれば、ヘッダファイルと対応するコンストラクション関数にはこのように書くことができます.
matrix<double> inputData;//header
inputData = zero_matrix<double>(ROW, LEN);//congstructor

これによりInputDataはROW*LENのゼロ行列に初期化される.
简単で细かい内容で、メモを取って、みんなに役に立つことを望んでいます.