距離行列の計算

C言語によるサンプルソースコード : 使用関数名:nag_mv_distance_mat (g03eac)

Keyword: 距離行列, 計算, 多変量解析

概要

本サンプルは距離行列の計算を行うC言語によるサンプルプログラムです。 本サンプルは以下に示されるデータについて距離行列の計算を行います。

距離行列計算のデータ 

※本サンプルはnAG Cライブラリに含まれる関数 nag_mv_distance_mat() のExampleコードです。本サンプル及び関数の詳細情報は nag_mv_distance_mat のマニュアルページをご参照ください。
ご相談やお問い合わせはこちらまで

入力データ

(本関数の詳細はnag_mv_distance_mat のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10

このデータをダウンロード
nag_mv_distance_mat (g03eac) Example Program Data
5 3
Nag_NoMatUp Nag_DistSquared Nag_NoVarScale
1.0 1.0 1.0
2.0 1.0 2.0
3.0 6.0 3.0
4.0 8.0 2.0
5.0 8.0 0.0
 0   1   1
1.0 1.0 1.0

  • 1行目はタイトル行で読み飛ばされます。
  • 2行目に観測値の数(n)と変数の数(m)を指定しています。
  • 3行目には既存の行列が更新されるかどうかを示すパラメータ(update)、計算される距離の種類(dist)、使用される変数の標準化(scale)を指定しています。この場合、"Nag_NoMatUp"は距離が行列Dに追加される前に行列Dは初期化されることを意味しています。 "Nag_DistSquared" はユークリッド平方距離を意味しています。 "Nag_NoVarScale" はスケールしないことを意味しています。
  • 4~8行目に変数の値(x)を指定しています。
  • 9行目に距離行列の計算に含まれるどうかを示すフラグ(isx)を指定しています。"1"の場合は計算に含まれます。
  • 10行目に変数に対するスケーリング(s)を指定しますが、"Nag_Nag_NoVarScale"の場合は各変数に対し 1.0 を指定しています。

出力結果

(本関数の詳細はnag_mv_distance_mat のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10
11

この出力例をダウンロード
nag_mv_distance_mat (g03eac) Example Program Results


 Distance Matrix 

       1       2       3       4

 2      1.00   
 3     29.00   26.00   
 4     50.00   49.00    5.00   
 5     50.00   53.00   13.00    4.00   

  • 4~11行目に距離行列が出力されています。

ソースコード

(本関数の詳細はnag_mv_distance_mat のマニュアルページを参照)

※本サンプルソースコードはnAG数値計算ライブラリ(Windows, Linux, MAC等に対応)の関数を呼び出します。
サンプルのコンパイル及び実行方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102

このソースコードをダウンロード
/* nag_mv_distance_mat (g03eac) Example Program.
 *
 * CLL6I261D/CLL6I261DL Version.
 *
 * Copyright 2017 Numerical Algorithms Group.
 *
 * Mark 26.1, 2017.
 *
 */

#include <nag.h>
#include <stdio.h>
#include <nag_stdlib.h>
#include <nagg03.h>

#define X(I, J) x[(I) *tdx + J]
int main(void)
{
  Integer exit_status = 0, i, *isx = 0, j, m, n, tdx;
  double *d = 0, *s = 0, *x = 0;
  char nag_enum_arg[40];
  Nag_DistanceType dist;
  Nag_MatUpdate update;
  Nag_VarScaleType scale;
  NagError fail;

  INIT_FAIL(fail);

  printf("nag_mv_distance_mat (g03eac) Example Program Results\n\n");

  /* Skip heading in data file */
  scanf("%*[^\n]");

  scanf("%ld", &n);
  scanf("%ld", &m);
  if (n >= 2 && m >= 1) {
    if (!(d = nAG_ALLOC(n * (n - 1) / 2, double)) ||
        !(s = nAG_ALLOC(m, double)) ||
        !(x = nAG_ALLOC((n) * (m), double)) || !(isx = nAG_ALLOC(m, Integer)))
    {
      printf("Allocation failure\n");
      exit_status = -1;
      goto END;
    }
    tdx = m;
  }
  else {
    printf("Invalid n or m.\n");
    exit_status = 1;
    return exit_status;
  }
  scanf("%39s", nag_enum_arg);
  /* nag_enum_name_to_value (x04nac).
   * Converts nAG enum member name to value
   */
  update = (Nag_MatUpdate) nag_enum_name_to_value(nag_enum_arg);
  scanf("%39s", nag_enum_arg);
  dist = (Nag_DistanceType) nag_enum_name_to_value(nag_enum_arg);
  scanf("%39s", nag_enum_arg);
  scale = (Nag_VarScaleType) nag_enum_name_to_value(nag_enum_arg);
  for (j = 0; j < n; ++j) {
    for (i = 0; i < m; ++i)
      scanf("%lf", &X(j, i));
  }
  for (i = 0; i < m; ++i)
    scanf("%ld", &isx[i]);
  for (i = 0; i < m; ++i)
    scanf("%lf", &s[i]);

  /* nag_mv_distance_mat (g03eac).
   * Compute distance (dissimilarity) matrix
   */
  nag_mv_distance_mat(update, dist, scale, n, m, x, tdx, isx, s, d, &fail);
  if (fail.code != NE_NOERROR) {
    printf("Error from nag_mv_distance_mat (g03eac).\n%s\n", fail.message);
    exit_status = 1;
    goto END;
  }

  /* Print the distance matrix */

  printf("\n");
  printf(" Distance Matrix ");
  printf("\n");
  printf("\n");
  printf("    %s\n", "   1       2       3       4");
  printf("\n");
  for (i = 2; i <= n; ++i) {
    printf("%2ld     ", i);
    for (j = (i - 1) * (i - 2) / 2 + 1; j <= i * (i - 1) / 2; ++j)
      printf("%5.2f   ", d[j - 1]);
    printf("\n");
  }

END:
  nAG_FREE(d);
  nAG_FREE(s);
  nAG_FREE(x);
  nAG_FREE(isx);

  return exit_status;
}


関連情報
© 日本ニューメリカルアルゴリズムズグループ株式会社 2025
Privacy Policy  /  Trademarks