/* DATファイル形式のPosteriorgramを2つ読み込んで局所距離行列を作成し、DPを行うプログラム ・PosteriorgramのDATファイルの中は一行目にフレーム数、二行目に状態数、三行目以降からフレーム毎の状態数分の事後確率がタブ区切りで入っている。 ・VisualStudioではスタック領域が1MBまでで足りないため、以下のような設定の変更が必要である。 プロジェクトの[プロパティ]→[構成プロパティ]→[リンカー]→[システム]→[スタックのサイズの設定]に適当な値を入力。   デフォルト値は1MBなので、10MB(10485760)を割り当てる。入力値の単位はバイトであることに注意 ・最大フレーム数を70にしたのはこれ以上大きな値になると、visual studio codeで動かなくなってしまうためです。 */ #include #include #include #include #pragma warning(disable: 4996) #define MAXFRAME 1024 #define STATE 3009 // メイン関数 int main(void) { char filename[2][10]; // ファイル名の配列 float pg[MAXFRAME][STATE]; // Posteriorgramの事後確率用配列 float pgx[STATE]; int frame_len[2]; // Posteriorgramのフレーム数を入れるための変数 float ip; // 内積計算用の変数 printf("Posteriorgramのファイル名を入力\n"); printf("一つ目:"); scanf("%s", filename[0]); printf("二つ目:"); scanf("%s", filename[1]); FILE* fp1,* fp2; // ファイルポインタ fp1 = fopen(filename[1], "r"); // ファイルを読み出し専用で開く if (fp1 == NULL) { // ファイルが開けていなかった場合 printf("%sをオープンできませんでした\n", filename[1]); return 0; } else { // ファイルが開けた場合 fscanf(fp1, "%d\n", &frame_len[1]); // フレーム数を読み込む fscanf(fp1, "%*d\n"); // 状態数を読み込み飛ばす // Posteriorgramを読み込み for (int j = 0; j < frame_len[1]; j++) // 行のループ for (int k = 0; k < STATE; k++) // 列のループ fscanf(fp1, "%f", &pg[j][k]); // データ1つ読み込み fclose(fp1); // ファイル閉じる } fp2 = fopen(filename[0], "r"); // ファイルを読み出し専用で開く if (fp2 == NULL) { // ファイルが開けていなかった場合 printf("%sをオープンできませんでした\n", filename[1]); return 0; } fscanf(fp2, "%d\n", &frame_len[0]); // フレーム数を読み込む fscanf(fp2, "%*d\n"); // 状態数を読み込み飛ばす const float max = 99999.0; // 大きな値 float ld[70]; float gd[2][70]; float minimum; int NEW = 1, OLD = 0, tmp; // i番目の列について局所距離と累積距離の計算 float dis1, dis2, dis3; // 累積距離の候補を一時的に保持する変数(3候補ぶん) minimum = max; for (int i = 0; i < frame_len[1]; i++) gd[OLD][i] = max; for (int i = 0; i < frame_len[0]; i++) { // 行のループ for (int k = 0; k < STATE; k++) // 列のループ fscanf(fp2, "%f", &pgx[k]); // データ1つ読み込み for (int j = 0; j < frame_len[1]; j++) { // 列のループ ip = 0; // 内積を初期化 for (int k = 0; k < STATE; k++) // フレーム同士の内積を計算 ip = ip + (pg[j][k] * pgx[k]); // 状態毎に事後確率の積を取り、足し合わせる ld[j] = -log10f(ip); // 内積の負の対数を取り、局所距離行列に代入 // CDPを行う OLD = NEW; NEW = tmp; } } fclose(fp2); // ファイル閉じる printf("%sと%sのscore:%f\n", filename[0], filename[1], minimum); return 0; }