/*-------------------------------------
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]);
}