前のページ|次のページ

GRAYCODE関数

n個の項目のすべてのサブセットを変化量の小さい順に生成します。

カテゴリ: 組み合わせ
制限事項: GRAYCODE関数は、%SYSFUNCマクロを使用する場合には実行できません。

構文

GRAYCODE(k, character-variable <, n <, in-out>>)

必須引数

k

数値変数を指定します。GRAYCODE関数を実行する前にkを次のいずれかの値に初期化します。

  • 負の数(GRAYCODEによってサブセットが空に初期化されます)
  • numeric-variable-1からnumeric-variable-n、またはcharacter-variableで指定する初期セットの項目数(0からn (0とnを含む)までの整数値である必要があります)
kの値は、GRAYCODEの実行時に更新されます。サブセットの項目数が値として返されます。

numeric-variable

値0または値1の数値変数を指定します。この値はGRAYCODEの実行時に更新されます。numeric-variable-jの値が1の場合、j番目の項目がサブセットにあることを表します。numeric-variable-jの値が0の場合、j番目の項目がサブセットにないことを表します。

GRAYCODEを実行する前に負の値をkに割り当てる場合、GRAYCODEを実行する前にnumeric-variable-1からnumeric-variable-nを初期化する必要はありません。ただし、非初期化変数に関するメモを非表示にする場合は除きます。
GRAYCODEを実行する前に0からn (0とnを含む)までの値をkに割り当てる場合、numeric-variable-1からnumeric-variable-nk個の値1とn-k個の値0に初期化する必要があります。

character-variable

長さが少なくともn文字の文字変数を指定します。先頭のn文字でどの項目がサブセットにあるかを示します。デフォルトでは、j番目の位置にある"I"はj番目の項目がサブセットにあることを示し、j番目の位置にある"O"はj番目の項目がサブセットにないことを示します。これらの2文字はin-out引数の指定で変更できます。

GRAYCODEを実行する前に負の値をkに割り当てる場合、GRAYCODEを実行する前にcharacter-variableを初期化する必要はありません。ただし、非初期化変数に関するメモを非表示にする場合は除きます。
GRAYCODEを実行する前に0からn (0とnを含む)までの値をkに割り当てる場合、character-variableを、項目がサブセットに含まれていることを示すk個の文字と項目がサブセットに含まれていないことを示すn-k個の文字に初期化する必要があります。

オプション引数

n

数値の定数、変数または式を指定します。デフォルトでは、ncharacter-variableの長さです。

in-out

文字定数、変数または式を指定します。デフォルト値は"IO"です。1番目の文字は項目がサブセットにあることを示すのに使用されます。2番目の文字は項目がサブセットにないことを示すのに使用されます。

詳細

kに負の値を割り当ててGRAYCODEを実行すると、サブセットが空に初期化されます。GRAYCODE関数はゼロを返します。
kに0からn (0とnを含む)までの整数値を割り当ててGRAYCODEを実行すると、サブセットの項目が1つ追加または削除され、サブセットの項目数と同じになるようにkの値が更新されます。サブセットのj番目の項目が追加または削除されると、GRAYCODE関数はjを返します。
n項目のすべてのサブセットを生成するには、kを負の値に初期化して、2**n回繰り返すループでGRAYCODEを実行します。空でないサブセットで開始するには、kをサブセットの項目数に初期化して、目的の初期サブセットを示すように他の引数を初期化し、2**n-1回繰り返すループでGRAYCODEを実行します。GRAYCODEで生成される一連のサブセットは循環するため、どのサブセットで開始してもかまいません。

例1: 数値変数(n=4)とk (初期値は負)を使用する

次のプログラムでは、数値変数を使用して変更の少ない順にサブセットを生成します。
data _null_;
   array x[4];
   n=dim(x);
   k=-1;
   nsubs=2**n;
   do i=1 to nsubs;
      rc=graycode(k, of x[*]);
      put i 5. +3 k= ' x=' x[*] +3 rc=;
   end;
run;
次の出力がログに書き込まれます。
    1 k=0 x=0 0 0 0 rc=0 2 k=1 x=1 0 0 0 rc=1 3 k=2 x=1 1 0 0 rc=2 4 k=1 x=0 1 0 0 rc=1 5 k=2 x=0 1 1 0 rc=3 6 k=3 x=1 1 1 0 rc=1 7 k=2 x=1 0 1 0 rc=2 8 k=1 x=0 0 1 0 rc=1 9 k=2 x=0 0 1 1 rc=4 10 k=3 x=1 0 1 1 rc=1 11 k=4 x=1 1 1 1 rc=2 12 k=3 x=0 1 1 1 rc=1 13 k=2 x=0 1 0 1 rc=3 14 k=3 x=1 1 0 1 rc=1 15 k=2 x=1 0 0 1 rc=2 16 k=1 x=0 0 0 1 rc=1

例2: Using a Character Variable and Positive Initial k

次の例では、文字変数を使用して変更の少ない順にサブセットを生成します。
data _null_;
   x='++++';
   n=length(x);
   k=countc(x, '+');
   put '    1' +3 k= +2 x=;
   nsubs=2**n;
   do i=2 to nsubs;
      rc=graycode(k, x, n, '+-');
      put i 5. +3 k= +2 x= +3 rc=;
   end;
run;
次の出力がログに書き込まれます。
    1 k=4 x=++++ 2 k=3 x=-+++ rc=1 3 k=2 x=-+-+ rc=3 4 k=3 x=++-+ rc=1 5 k=2 x=+--+ rc=2 6 k=1 x=---+ rc=1 7 k=0 x=---- rc=4 8 k=1 x=+--- rc=1 9 k=2 x=++-- rc=2 10 k=1 x=-+-- rc=1 11 k=2 x=-++- rc=3 12 k=3 x=+++- rc=1 13 k=2 x=+-+- rc=2 14 k=1 x=--+- rc=1 15 k=2 x=--++ rc=4 16 k=3 x=+-++ rc=1

関連項目:

CALLルーチン:
前のページ|次のページ|ページの先頭へ