前のページ|次のページ

CALL GRAYCODEルーチン

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

カテゴリ: 組み合わせ

構文

CALL GRAYCODE(k, numeric-variable-1, ..., numeric-variable-n);
CALL GRAYCODE(k, character-variable <, n <, in-out> >);

必須引数

k

数値変数を指定します。CALL GRAYCODEルーチンを実行する前に、kを次のいずれかの値に初期化します。

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

numeric-variable

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

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

character-variable

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

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

オプション引数

n

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

in-out

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

詳細

DATAステップでCALL GRAYCODEを使用する

kに負の値を指定してCALL GRAYCODEルーチンを実行すると、サブセットは初期化されて空になります。
kに0とnの間(0とnを含む)の整数値を指定してCALL GRAYCODEを実行すると、1つの項目がサブセットに追加されるか、サブセットから削除されて、kの値がサブセット内の項目数と同値に更新されます。
n個の項目のすべてのサブセットを生成するには、kを負の値に初期化し、CALL GRAYCODEを2**n回、ループで繰り返して実行します。空でないサブセットから開始するには、kをサブセット内の項目数に初期化し、その他の引数を必要な初期サブセットを指定するように初期化して、CALL GRAYCODEを2**n-1回、ループで繰り返して実行します。CALL GRAYCODEで生成される一連のサブセットは循環するため、どのサブセットで開始してもかまいません。

マクロとCALL GRAYCODEルーチンを使用する

GRAYCODEルーチンは、%SYSCALLマクロを使って呼び出せます。CALL GRAYCODEルーチンをDATAステップで使用するときと、マクロで使用するときの間にはいくつかの違いがあります。マクロでの使用方法を次に示します。
  • すべての引数を空でない値に初期化する必要があります。
  • character-variable引数を使用する場合、空ではなく、少なくともn文字の数値以外の文字列に初期化する必要があります。
  • in-out引数を使用する場合は、空白、数値、小数点、プラス記号、マイナス記号以外の2文字に初期化する必要があります。
%SYSCALLで引数の種類が誤っていると判別された場合、または引数の種類を判別できない場合は、&SYSERRおよび&SYSINFOが設定されません
それ以外の場合にCALL GRAYCODルーチンの実行中にエラーが発生すると、次の両方の値が設定されます。
  • &SYSERRには4よりも大きい値が割り当てられます。
  • &SYSINFOには-100よりも小さい値が割り当てられます。
エラーがない場合、&SYSERRはゼロに設定されて、&SYSINFOは次のいずれかの値に設定されます。
  • 0(入力のkの値が負の場合)
  • サブセットに追加、またはサブセットから削除された項目のインデックス(入力のkの値が負ではない有効な整数の場合)

例1: CALL GRAYCODEで文字変数と正の初期値のkを使用する

CALL GRAYCODEルーチンを使用して変化量の小さい順にサブセットを生成する例を次に示します。
data _null_;
   x='++++';
   n=length(x);
   k=countc(x, '+');
   put '    1' +3 k= +2 x=;
   nsubs=2**n;
   do i=2 to nsubs;
      call graycode(k, x, n, '+-');
      put i 5. +3 k= +2 x=;
   end;
run;
次の出力がログに書き込まれます。
    1 k=4 x=++++ 2 k=3 x=-+++ 3 k=2 x=-+-+ 4 k=3 x=++-+ 5 k=2 x=+--+ 6 k=1 x=---+ 7 k=0 x=---- 8 k=1 x=+--- 9 k=2 x=++-- 10 k=1 x=-+-- 11 k=2 x=-++- 12 k=3 x=+++- 13 k=2 x=+-+- 14 k=1 x=--+- 15 k=2 x=--++ 16 k=3 x=+-++

例2: 数値変数とk (負)を指定した%SYSCALLを使用する

数値変数を持つ%SYSCALLマクロで変化量の小さい順にサブセットを生成する例を次に示します。
%macro test;
   %let n=3;
   %let x1=.;
   %let x2=.;
   %let x3=.;
   %let k=-1;
   %let nsubs=%eval(2**&n + 1);
   %put nsubs=&nsubs k=&k x: &x1 &x2 &x3;
   %do j=1 %to &nsubs;
      %syscall graycode(k, x1, x2, x3);
      %put &j: k=&k x: &x1 &x2 &x3 sysinfo=&sysinfo;
   %end;
%mend;
%test;
次の出力がログに書き込まれます。
nsubs=9 k=-1 x: ...1: k=0 x: 0 0 0 sysinfo=0 2:k=1 x: 1 0 0 sysinfo=1 3:k=2 x: 1 1 0 sysinfo=2 4:k=1 x: 0 1 0 sysinfo=1 5:k=2 x: 0 1 1 sysinfo=3 6:k=3 x: 1 1 1 sysinfo=1 7:k=2 x: 1 0 1 sysinfo=2 8:k=1 x: 0 0 1 sysinfo=1 9:k=0 x: 0 0 0 sysinfo=3

例3: 文字変数とk (負)を指定した%SYSCALLを使用する

文字変数を持つ%SYSCALLマクロで変化量の小さい順にサブセットを生成する例を次に示します。
%macro test(n);
   %*** Initialize the character variable to a 
        sufficiently long nonblank, nonnumeric value. ;
   %let x=%sysfunc(repeat(_, &n-1));
   %let k=-1;
   %let nsubs=%eval(2**&n + 1);
   %put nsubs=&nsubs k=&k x="&x";
   %do j=1 %to &nsubs;
      %syscall graycode(k, x, n);
      %put &j: k=&k x="&x" sysinfo=&sysinfo;
   %end;
%mend;
%test(3);
次の出力がログに書き込まれます。
nsubs=9 k=-1 x="___" 1: k=0 x="OOO" sysinfo=0 2: k=1 x="IOO" sysinfo=1 3: k=2 x="IIO" sysinfo=2 4: k=1 x="OIO" sysinfo=1 5: k=2 x="OII" sysinfo=3 6: k=3 x="III" sysinfo=1 7: k=2 x="IOI" sysinfo=2 8: k=1 x="OOI" sysinfo=1 9: k=0 x="OOO" sysinfo=3

関連項目:

関数:
前のページ|次のページ|ページの先頭へ