1

線形インデックスを使用して、MがN個のタプルを選択してインデックスを作成しようとしています。少し前に、ペアのインデックス関数としてMChoose2のコードを作成しました。

   function K=pairidx( i, j)
      if(i>j)
        swap(i,j);
      K=j-(i+1) +   (i)*(2*M-1)-i*(i-1)/2;
   end

今必要なのは、これをMがNを選択するように一般化することです。理想的には、インデックスKからいくつかのタプル(K_1、K_2、...、K_N)に変換できる逆関数があります。これまで私はブルートフォース方式を実行してきましたが、N = 3の場合、次の関数を記述しましたが、これが最善ではないことを願っています。

function lookup=tripletable()
d=nchoosek(M,N);
idx=1;
lookup=zeros(d,3);
for i=1:M
     for j=i+1:M
         for k=j+1:M
             lookup(idx,:)=[i,j,k];
             idx=idx+1;
         end
     end
end
4

1 に答える 1

0

Jeradがコメントしnchoosek(v,k)たように、組み合わせのリスト全体を生成し、Matlabに(ソートされた)組み合わせを任意の行に一致させるために使用できます。ただし、これにはリスト全体を生成する必要があり、MとNが大きくなると非常に大きくなる可能性があります。

次のコードを使用して、インデックスごとの組み合わせを取得できます。可能な組み合わせの数を計算し、指定したインデックスがその範囲内にあるかどうかを確認します。次に、すべての要素を繰り返し決定します

function combination=getCombinationByIndex(v,K,N)
M=size(v,2);
k=K;
l=0;
combination=zeros(1,N);
for i=1:N
    %determine combination(i)
    while(true)
        l=l+1;
        C=nchoosek(M-l,N-i);         
        if(k>C)
            k=k-C;
        else
            combination(i) = v(l);
            break;
        end
    end
end

逆の操作も同様です。組み合わせを並べ替えて要素を調べ、現在の組み合わせがその範囲内にあるかどうかを確認します。

編集:トピックスターターによって提供され、要素の任意のセットを許可するように拡張された逆の操作:

function k=getIndexByCombination(v,combo) 
M=length(v);
v=sort(v);
combo=sort(combo); 
N=length(combo); 
l=0; 
%k is the index 
k=1; 
for i=1:N
    while(true)
        l=l+1;    
        if(combo(i)==v(l))
            break;
        else
            C=nchoosek(M-l,N-i);
            k=k+C;
        end
    end
end
于 2012-12-06T08:53:09.247 に答える