ROOTStudy

木曜日, 12月 28, 2006

TLateX:TeX数式中で「斜体ではない」文字を出す

\mathrm{mm}と書けば
mmは斜体にならない。

木曜日, 12月 14, 2006

Operator: 行列の積 = "*="

{
gROOT->Reset();


TMatrixD m, n;

m.ResizeTo(3,3,-1);
n.ResizeTo(3,3,-1);

m[0][0] = 1.0; m[0][1] = 2.0; m[0][2] = 3.0;
m[1][0] = 4.0; m[1][1] = 8.0; m[1][2] = 6.0;
m[2][0] = 7.0; m[2][1] = 8.0; m[2][2] = 9.0;

m.Print();

n += m;
n *= m.T();//T()呼び出しでm自身も転置されることに注意

m.Print();
n.Print();
}

実行結果


3x3 matrix is as follows

| 0 | 1 | 2 |
------------------------------------------------------------------
0 | 1 2 3
1 | 4 8 6
2 | 7 8 9


3x3 matrix is as follows

| 0 | 1 | 2 |
------------------------------------------------------------------
0 | 1 4 7
1 | 2 8 8
2 | 3 6 9


3x3 matrix is as follows

| 0 | 1 | 2 |
------------------------------------------------------------------
0 | 14 38 50
1 | 38 116 146
2 | 50 146 194

GetSubで行列の一部を抜き出し

{
gROOT->Reset();


TMatrixD m, n;

m.ResizeTo(3,3,-1);
n.ResizeTo(3,3,-1);

m[0][0] = 1.0; m[0][1] = 2.0; m[0][2] = 3.0;
m[1][0] = 4.0; m[1][1] = 8.0; m[1][2] = 6.0;
m[2][0] = 7.0; m[2][1] = 8.0; m[2][2] = 9.0;

n.Print();//3*3のまま

n += m.GetSub(0,1,0,1,"S");//"S"は省略可

n.Print();//2*2に縮小される
m.Print();

}
実行結果

3x3 matrix is as follows

| 0 | 1 | 2 |
------------------------------------------------------------------
0 | 0 0 0
1 | 0 0 0
2 | 0 0 0


2x2 matrix is as follows

| 0 | 1 |
------------------------------------------------------------------
0 | 1 2
1 | 4 8


3x3 matrix is as follows

| 0 | 1 | 2 |
------------------------------------------------------------------
0 | 1 2 3
1 | 4 8 6
2 | 7 8 9

行列:TMatrix応用 固有値、固有ベクトル、転置行列

{
gROOT->Reset();


TMatrixD m, n, p, q;

m.ResizeTo(3,3,-1);
n.ResizeTo(3,3,-1);
p.ResizeTo(3,3,-1);
q.ResizeTo(3,3,-1);

m[0][0] = 1.0; m[0][1] = 2.0; m[0][2] = 3.0;
m[1][0] = 4.0; m[1][1] = 8.0; m[1][2] = 6.0;
m[2][0] = 7.0; m[2][1] = 8.0; m[2][2] = 9.0;

TMatrixDEigen *x = new TMatrixDEigen(m);
n += x->GetEigenVectors();//固有ベクトル
p += x->GetEigenValues();//固有値

m.Print();//それぞれ出力
n.Print();
p.Print();

q += m.T();//転置行列、呼ばれるとm自身も転置
q.Print();
m.Print();

}

3x3 matrix is as follows

| 0 | 1 | 2 |
------------------------------------------------------------------
0 | 1 2 3
1 | 4 8 8
2 | 7 6 9


3x3 matrix is as follows

| 0 | 1 | 2 |
------------------------------------------------------------------
0 | -0.2246 0.275 0.8101
1 | -0.6195 -0.769 0.03001
2 | -0.7981 0.5965 -0.5855


3x3 matrix is as follows

| 0 | 1 | 2 |
------------------------------------------------------------------
0 | 17.18 0 0
1 | 0 1.915 0
2 | 0 0 -1.094


3x3 matrix is as follows

| 0 | 1 | 2 |
------------------------------------------------------------------
0 | 1 4 7
1 | 2 8 8
2 | 3 6 9

3x3 matrix is as follows

| 0 | 1 | 2 |
------------------------------------------------------------------
0 | 1 4 7
1 | 2 8 8
2 | 3 6 9

TMatixDは行列を扱う

{
gROOT->Reset();


TMatrixD m(3,3);

m[0][0] = 1.0;
m[0][1] = 2.0;
m[0][2] = 3.0;

m[1][0] = 4.0;
m[1][1] = 8.0;
m[1][2] = 6.0;

m[2][0] = 7.0;
m[2][1] = 8.0;
m[2][2] = 9.0;

Double_t det;
m.Invert(&det);

m.Print();

}

簡易DICOM画像の読み込み

void Read(char *filename)
{
//まず16bit、白黒データのみを対象とする
//残りのフォーマットは関数のオーバーロードで対処
//example:
//Read("sample1.dcm");
//
long i, j;
FILE *ar;
long k;
unsigned short wd;
unsigned short shift = 256;
sprintf(fname, "%s", filename);
ar = fopen(filename, "rb"); //rでなくrbに注意
k = sizeof(unsigned short);
long sizex = 512; //横方向pixel
long sizey = 512; //縦方向pixel
long xy[512][512]; //読み込むファイル
long upperlimit = 60000;
printf("size = %ld\n", k);
printf("ar = %ld\n", ar);
printf("eof = %d\n", EOF);

if(ar != 0){
printf("filename = %s\n", filename);
fread(&wd, sizeof(unsigned short),1, ar);
printf("wd = %d\n", wd);
while(wd!=32736){ //0x7FE0まで空読み
fread(&wd, sizeof(unsigned short),1, ar);
}
while(wd!=16){ //0x0010まで空読み {7FE0,0010}はPixelDataの開始
fread(&wd, sizeof(unsigned short),1, ar);
}
for(i = 0; i < sizey; i++){
for(j = 0; j < sizex; j++){
fread(&wd, sizeof(unsigned short),1, ar);
if(wd > upperlimit){wd = 0;}
xy[j][i] = wd;
}
}
printf("read finish.\n");
fclose(ar);
}
else{printf("file not readed.\n");}
}