多次元尺度構成法の計算

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

ホーム > 製品 > nAG数値計算ライブラリ > サンプルソースコード集 > 多次元尺度構成法の計算 (C言語/C++)

Keyword: 多次元尺度, 構成法, 計算, 多変量解析, MDS

概要

本サンプルは多次元尺度構成法の計算を行うC言語によるサンプルプログラムです。 本サンプルは以下に示される距離行列について多次元尺度構成法の計算を行います。

多次元尺度構成法のデータ 

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

入力データ

(本関数の詳細はnag_mv_ordinal_multidimscale のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

このデータをダウンロード
nag_mv_ordinal_multidimscale (g03fcc) Example Program Data

14 2 Nag_Stress

0.099
0.033 0.022
0.183 0.114 0.042
0.148 0.224 0.059 0.068
0.198 0.039 0.053 0.085 0.051
0.462 0.266 0.322 0.435 0.268 0.025
0.628 0.442 0.444 0.406 0.240 0.129 0.014
0.113 0.070 0.046 0.047 0.034 0.002 0.106 0.129
0.173 0.119 0.162 0.331 0.177 0.039 0.089 0.237 0.071
0.434 0.419 0.339 0.505 0.469 0.390 0.315 0.349 0.151 0.430
0.762 0.633 0.781 0.700 0.758 0.625 0.469 0.618 0.440 0.538 0.607
0.530 0.389 0.482 0.579 0.597 0.498 0.374 0.562 0.247 0.383 0.387 0.084
0.586 0.435 0.550 0.530 0.552 0.509 0.369 0.471 0.234 0.346 0.456 0.090 0.038

  • 1行目はタイトル行で読み飛ばされます。
  • 3行目には距離行列のオブジェクト数(n)、データを表すのに使用される次元の数(ndim)、ストレス(stress)と平方ストレス(SSTRESS)のどちらが使用されるかを示すパラメータ(type)を指定しています。"Nag_Stress"はストレスが使用されることを意味しています。
  • 5~17行目に下三角の距離行列(d)を指定しています。

出力結果

(本関数の詳細はnag_mv_ordinal_multidimscale のマニュアルページを参照)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

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


          STRESS =    1.2557e-01

Co-ordinates

    0.2060    0.2439
    0.1063    0.1418
    0.2224    0.0817
    0.3032    0.0355
    0.2645   -0.0698
    0.1554   -0.0435
   -0.0070   -0.1612
    0.0749   -0.3275
    0.0488    0.0289
    0.0124   -0.0267
   -0.1649   -0.2500
   -0.5073    0.1267
   -0.3093    0.1590
   -0.3498    0.0700

  • 4行目にストレスの値が出力されています。
  • 6~21行目には座標が出力されています。

ソースコード

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

※本サンプルソースコードは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

このソースコードをダウンロード
/* nag_mv_ordinal_multidimscale (g03fcc) 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 NMAX  14

#define X(I, J) x[(I-1)*tdx + (J-1)]

int main(void)
{
  Integer exit_status = 0, i, j, n, ndim, nn, tdx = NMAX;
  double *d = 0, *dfit = 0, *e = 0, stress, *x = 0;
  char nag_enum_arg[40];
  Nag_ScaleCriterion type;
  NagError fail;

  INIT_FAIL(fail);

  printf("nag_mv_ordinal_multidimscale (g03fcc) Example Program Results\n\n");

  /* Skip heading in data file */
  scanf("%*[^\n]");
  scanf("%ld", &n);
  scanf("%ld", &ndim);
  scanf("%39s", nag_enum_arg);
  /* nag_enum_name_to_value (x04nac).
   * Converts nAG enum member name to value
   */
  type = (Nag_ScaleCriterion) nag_enum_name_to_value(nag_enum_arg);

  if (ndim >= 1 && n > ndim) {
    if (!(d = nAG_ALLOC(n * (n - 1) / 2, double)) ||
        !(dfit = nAG_ALLOC(4 * (n * (n - 1) / 2), double)) ||
        !(e = nAG_ALLOC(n, double)) || !(x = nAG_ALLOC(n * n, double)))
    {
      printf("Allocation failure\n");
      exit_status = -1;
      goto END;
    }
    tdx = n;
  }
  else {
    printf("Invalid ndim or n.\n");
    exit_status = 1;
    return exit_status;
  }
  nn = n * (n - 1) / 2;
  for (i = 1; i <= nn; ++i)
    scanf("%lf", &d[i - 1]);

  /* nag_mv_prin_coord_analysis (g03fac).
   * Principal co-ordinate analysis
   */
  nag_mv_prin_coord_analysis(Nag_LargeEigVals, n, d, ndim, x, tdx, e, &fail);
  if (fail.code != NE_NOERROR) {
    printf("Error from nag_mv_prin_coord_analysis (g03fac).\n%s\n",
           fail.message);
    exit_status = 1;
    goto END;
  }

  /* nag_mv_ordinal_multidimscale (g03fcc).
   * Multidimensional scaling
   */
  nag_mv_ordinal_multidimscale(type, n, ndim, d, x, tdx, &stress, dfit,
                               E04_DEFAULT, &fail);
  if (fail.code != NE_NOERROR) {
    printf("Error from nag_mv_ordinal_multidimscale (g03fcc).\n%s\n",
           fail.message);
    exit_status = 1;
    goto END;
  }

  printf("\n          STRESS = %13.4e\n\n", stress);
  printf("Co-ordinates\n\n");

  for (i = 1; i <= n; ++i) {
    for (j = 1; j <= ndim; ++j)
      printf("%10.4f", X(i, j));
    printf("\n");
  }

END:
  nAG_FREE(d);
  nAG_FREE(dfit);
  nAG_FREE(e);
  nAG_FREE(x);

  return exit_status;
}


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