2008年11月30日日曜日

コーディング規約

って大事だなって思った瞬間.

後輩のデバッグに付き合っている時のこと.

後輩の作ったlinkという自前クラス(多分伝送路クラスだと思う)が型として認識されない(link p でエラーが出る).
しかも,Windows上でMinGWだとOKなのにSolarisやLinux上だと怒られる...
なんでかと思ったら,linkって関数があるらしい.知らんかった...ってか,Windows上にはないのね.

コーディング規約って大事だなって思った瞬間でした..

クラス名は大文字で始めましょう!!


追伸.link2って名前でエラーを逃れた後輩をちょっと尊敬しました.

2008年11月21日金曜日

NetBeans 6.5

正式にリリースされました.

http://ja.netbeans.org/

2008年11月14日金曜日

行列のできるプログラミング言語(3)

C++編(2)


■(鬼の)liboctave



#include <octave/config.h>
#include <octave/Matrix.h>
#include <iostream>
using namespace std;

int main(int argc, char**argv)
{
double m[][3] = { { 3, -4, 2 }, { 2, 5, 3 }, { -2, 3, -2 } };
Matrix A(3,3);
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
A(i,j) = m[i][j];
// 行列の表示
cout << "matrix A:" << endl << A << endl;
// 逆行列の表示
cout << "inv(A):" << endl << A.inverse() << endl;
// 元の行列との積の計算
cout << "A*inv(A)" << endl << A*A.inverse() << endl;
// ついでに固有値分解(笑)
EIG eig(A);
cout << "Eigen Vector" << endl << eig.eigenvectors() << endl;
cout << "Eigen Values" << endl << eig.eigenvalues() << endl;

return 0;
}

2008年11月7日金曜日

boost 1.37

リリースされたようです.

この辺参照.
新しいライブラリはProtoのみみたいですけど.

にしても,肥大化の一途を辿るboostの到着点は何処??

2008年11月5日水曜日

Solaris 10 10/08

Solaris 10 10/08が10月31日に出ました.
http://www.sun.com/aboutsun/pr/2008-10/sunflash.20081031.1.xml

2008年11月1日土曜日

行列のできるプログラミング言語(2)

C++編


boost::numeric::ublas編


uBLAS_Util.hpp


#ifndef __UBLAS_UTIL_HPP__
#define __UBLAS_UTIL_HPP__

#include <iostream>
#include <cmath>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/lu.hpp>
#include <boost/numeric/ublas/triangular.hpp>

using namespace std;
using namespace boost;
using namespace boost::numeric;
using namespace boost::numeric::ublas;

typedef ublas::matrix<double> dmatrix;
typedef ublas::matrix<complex<double> > cdmatrix;
typedef ublas::vector<double> dvector;
typedef ublas::vector<complex<double> > cdvector;

/*
matrixの表示
*/
template<class Matrix>
void m_print(Matrix x) {
int n1 = x.size1();
int n2 = x.size2();
for (int i = 0; i < n1; i++) {
for (int j = 0; j < n2; j++) {
cout << x(i, j) << "\t";
}
cout << endl;
}
return;
}

/*
vectorの表示
*/
template<class Vector>
void v_print(Vector x) {
int n = x.size();
for (int i = 0; i < n; i++) {
cout << x(i) << endl;
}
return;
}

#endif

main.cpp


#include <iostream>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/io.hpp>
#include <boost/numeric/ublas/lu.hpp>
#include <boost/numeric/ublas/triangular.hpp>
#include "uBlas_Util.hpp"
using namespace std;
using namespace boost::numeric::ublas;

int main() {
// make matrix A
dmatrix A(3, 3);
double m[][3] = { { 3, -4, 2 }, { 2, 5, 3 }, { -2, 3, -2 } };
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
A(i, j) = m[i][j];
}
}
cout << "matrix A:" << endl;
m_print(A);
// make A^-1
dmatrix I = identity_matrix<double>(3);// 単位行列
dmatrix copyA(A);// Aのコピー
// LU分解時の行交換情報が入る行列
permutation_matrix<> pm(A.size1());
// LU分解
lu_factorize(A,pm);
// 行交換を考慮した前進消去と後退代入
lu_substitute(A,pm,I);

// 解の表示
cout << "A^-1" << endl;
m_print(I);
// A*A^-1
cout << "A*A^-1" << endl;
m_print(prod(copyA,I));

return 0;
}

行列のできるプログラミング言語(1)

いつか何かの役に立つかも知れないのでメモ.

Java編



Jakarta commons math



import java.math.BigDecimal;
import org.apache.commons.math.linear.*;

public class Main {
public static void main(String[] args) {
// 行列Aを作成
double[][] m = {{3,-4,2}, {2,5,3}, {-2,3,-2}};
BigMatrix A = MatrixUtils.createBigMatrix(m);
System.out.println("行列A");
printBigMatrix(A);
// Aの逆行列A^-1を求める
BigMatrix inA = A.inverse();
System.out.println("行列A^-1");
printBigMatrix(inA);
// AとA^-1の積
BigMatrix tmp = A.multiply(inA);
System.out.println("A*A^-1");
printBigMatrix(tmp);
// 連立方程式
// Ax = b
BigDecimal [] b =new BigDecimal [3];
double [] t = {0,6,1};
for(int i=0;i<3;i++){
b[i]= new BigDecimal(t[i]);
}
BigDecimal[] x = A.solve(b);
System.out.println("連立方程式");
for(int i=0;i<3;i++){
System.out.println(x[i]);
}
return;
}
public static void printBigMatrix(BigMatrix tmp){
for (int i = 0; i < tmp.getRowDimension(); i++) {
for(int j=0;j<tmp.getColumnDimension();j++){
System.out.print(tmp.getEntry(i, j) + "\t");
}
System.out.print("\n");
}
}
}


JAMA編



import Jama.*;

public class Main {
public static void main(String[] args) {
double[][] m = {{3,-4,2}, {2,5,3}, {-2,3,-2}};
Matrix A = new Matrix(m);
double [] t = {0,6,1};
Matrix b = new Matrix(3,1);
for(int i=0;i<3;i++)
b.set(i, 0, t[i]);
Matrix x = A.solve(b);
for(int i = 0;i<x.getRowDimension();i++)
System.out.println(x.get(i, 0));
}

}