前のページ|次のページ

ALLPERM関数

複数の変数の値のすべての順列を変化量の小さい順に生成します。

カテゴリ: 組み合わせ

構文

ALLPERM(count, variable-1 <,variable-2 ...>)

必須引数

count

1まで順列数までの範囲の整数値で変数を指定します。

variable

すべての数値変数または同じ長さのすべての文字変数を指定します。これらの変数の値は置換されます。

制限事項 18個以内で変数を指定します。
要件 ALLPERM関数を実行する前にこれらの変数を初期化します。

詳細

基本

ALLPERM関数をループで使用して、ALLPERMの第1引数で各整数値(1から順列数まで)を受け入れます。最初の実行で、引数の種類と長さに不整合がないか確認されます。後続の各実行で、2つの連続変数の値が交換されます。
注: 順列数は、PERM関数を使用して計算できます。詳細については、 PERM関数を参照してください。ALLPERM関数では、次の値が返されます。
  • 0 (count=1の場合)
  • J (variable-Jおよびvariable-Kの値が交換される場合(K=J+1))
  • –1 (count>N!の場合)
ALLPERM関数を使用する場合に第1引数の順序が違っていると、その結果は役に立ちません。たとえば、変数を初期化した直後に第1引数にKを指定してALLPERM関数を実行しても、K番目の順列の結果は得られません(Kが1の場合を除く)。K番目の順列を取得するには、第1引数に1からKまでの値を正しい順序で取得して、ALLPERM関数をK回実行する必要があります。
ALLPERMは、一部の変数に同じ値や欠損値が含まれている場合でも常にN!個の順列を生成します。同じ値があるときに重複しない順列のみを生成する場合や、順列から欠損値を除外する場合は、かわりにLEXPERM関数を使用します。
注: ALLPERM関数は、%SYSFUNCマクロを使用する場合には実行できません。

比較

SASには、すべての順列を生成する3つの関数またはCALLルーチンがあります。
  • ALLPERM:複数の変数の値(欠損値または非欠損値)の考えられるすべての順列を生成します。各順列は、前の順列に基づいて形成されます(2つの連続する値を交換)。
  • LEXPERM:複数の変数の非欠損値の重複しないすべての順列を生成します。順列は、辞書式順序で生成されます。
  • LEXPERK:N個の変数の非欠損値からK個の重複しないすべての順列を生成します。順列は、辞書式順序で生成されます。
ALLPERMは最も速い関数およびCALLルーチンです。最も遅いのはLEXPERKです。

次の例では、ALLPERM関数を使用して特定の値の順列を生成します。
data _null_;
   array x [4] $3 ('ant' 'bee' 'cat' 'dog'); 
   n=dim(x);
   nfact=fact(n); 
   do i=1 to nfact+1;   
      change=allperm(i, of x[*]);
      put i 5. +2 change +2 x[*];
   end;
run;
次の出力がログに書き込まれます。
    1 0 ant bee cat dog 2 3 ant bee dog cat 3 2 ant dog bee cat 4 1 dog ant bee cat 5 3 dog ant cat bee 6 1 ant dog cat bee 7 2 ant cat dog bee 8 3 ant cat bee dog 9 1 cat ant bee dog 10 3 cat ant dog bee 11 2 cat dog ant bee 12 1 dog cat ant bee 13 3 dog cat bee ant 14 1 cat dog bee ant 15 2 cat bee dog ant 16 3 cat bee ant dog 17 1 bee cat ant dog 18 3 bee cat dog ant 19 2 bee dog cat ant 20 1 dog bee cat ant 21 3 dog bee ant cat 22 1 bee dog ant cat 23 2 bee ant dog cat 24 3 bee ant cat dog 25 -1 bee ant cat dog

関連項目:

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