/*-------------------------------------
2007/2/28
CLUTO のライブラリのサンプルプログラム
コンパイルは
> gcc gomi.c -lcluto -lm
実行は
> ./a.out tr45.mat 10
-----------------------------------------*/
#include <stdio.h> #include "cluto.h" #define MAXLENG 50000 int main(int argc, char *argv[]) { FILE *fp; char line[MAXLENG],*p; int clsn, rown, clmn, nzn, cn, rp, vp,i; double vl; int *rowptr, *rowind, *result; float *rowval; /*----- ここから行列の読み込みの処理、本質的でない -----*/ /* 引数は2つ、 matrixfile clsnumber */ if ((fp = fopen(argv[1],"r")) == NULL) exit(1); clsn = atoi(argv[2]); /* 1行目の処理 --- CLUTO に渡す引数の設定 */ if (fgets(line,MAXLENG,fp) == NULL) exit(1); p = strtok(line," "); rown = atoi(p); p = strtok(NULL," "); clmn = atoi(p); p = strtok(NULL," "); nzn = atoi(p); rowptr = (int *)malloc(sizeof(int)*(rown + 1)); rowind = (int *)malloc(sizeof(int)*nzn); rowval = (float *)malloc(sizeof(float)*nzn); result = (int *)malloc(sizeof(int)*rown); /* 2行目以降のデータ */ rp = 0; vp = 0; while(fgets(line,MAXLENG,fp) != NULL) { /* 行の最初は空白かタブ、最低1個はデータを持つ、1個目 */ p = strtok(line," \t"); cn = atoi(p); p = strtok(NULL," \t"); vl = atol(p); rowptr[rp] = vp; rp++; rowind[vp] = cn - 1; rowval[vp] = (float) vl; vp++; /* 2個目以降のデータ */ while(1) { if ((p = strtok(NULL," \t")) == NULL) break; cn = atoi(p); p = strtok(NULL," \t"); vl = atol(p); rowind[vp] = cn - 1; rowval[vp] = (float) vl; vp++; } } close(fp); /*--------- 行列の読み込み終わり --------------------*/ /* CLUTO のライブラリの利用 */ CLUTO_VP_ClusterRB(rown-1,clmn,rowptr,rowind,rowval, CLUTO_SIM_COSINE, CLUTO_CLFUN_I2, CLUTO_ROWMODEL_NONE, CLUTO_COLMODEL_IDF, 1.0, 10, 10, 8, CLUTO_CSTYPE_BESTFIRST, 0, 0, clsn, result); /* 結果の表示 */ for(i = 0;i < rown;i++) printf("%d\n",result[i]); }