2017-01-18 7 views
1

Iはn=4要素と集合N = {1,2,3,4を有し、このための可能な隣接する組み合わせは、隣接する要素

{empty set} {1} {2} {3} {4} {1,2} {2,3} {3,4} {1,2,3} {2,3,4} and {1,2,3,4}

したがって合計の可能な組み合わせを用いて計算することができる、C = 11であります式:

c=(n^2/2)+(n/2)+1

私はその要素が再ことができる以下のようなA = n X cを使用して、これをモデル化することができ

Matrix A

私はMATLABでこれを実現しようとしているが、上記の数学Iは、ハードコードされているので、私のコードはn > 4例のために拡張可能ではない:

(N、C)であるとして提示
n=4; 
c=((n^2)/2)+(n/2)+1; 
A=zeros(n,c); 

for i=1:n 
    A(i,i+1)=1; 
end 

for i=1:n-1 
    A(i,n+i+1)=1; 
    A(i+1,n+i+1)=1; 
end 

for i=1:n-2 
    A(i,n+i+4)=1; 
    A(i+1,n+i+4)=1; 
    A(i+2,n+i+4)=1; 
end 

for i=1:n-3 
    A(i,n+i+6)=1; 
    A(i+1,n+i+6)=1; 
    A(i+2,n+i+6)=1; 
    A(i+3,n+i+6)=1; 
end 

nはMATLABでこの問題を変換するために、比較的複雑度の低い方法はありますセットの要素Nの数、私の上記の数学的定式化は次のうちどれですか?

+3

あなたの実際の質問はここで何ですか?すでに解決策があるようですが、それはありませんか? – Suever

+0

これがどのように他の任意のセットに拡張されるのか尋ねていますか? – mpaskov

+0

はい私はすでに解決策を持っていますが、私はMATLABを初めて使用しており、アルゴリズムとしてMATLABにプログラミングしたいと考えています。どのようにプログラムすることができますか? – Amigo

答えて

2

この簡単な方法は、最初のkビットを設定したビットパターンを取得し、それをn - k回シフトして、シフトした各列ベクトルを結果に保存することです。だから、私たちは、これを達成するためにcircshiftを使用します

|1 0 0 0| 
|0 1 0 0| 
|0 0 1 0| 
|0 0 0 1| 

を取得するために

1 
0 
0 
0 

シフト1、2、および3回から始まります。 n = 4 and 6で関数を呼び出す

function A = adjcombs(n) 
    c = (n^2 + n)/2 + 1; % number of combinations 
    A = zeros(n,c);  % preallocate output array 

    col_idx = 1;    % skip the first (all-zero) column 
    curr_col = zeros(n,1); % column vector containing current combination 
    for elem_count = 1:n 
     curr_col(elem_count) = 1; % add another element to our combination 
     for shift_count = 0:(n - elem_count) 
     col_idx = col_idx + 1; % increment column index 
     % shift the current column and insert it at the proper index 
     A(:,col_idx) = circshift(curr_col, shift_count); 
     end 
    end 
end 

我々が得る:

>> A = adjcombs(4) 
A = 

    0 1 0 0 0 1 0 0 1 0 1 
    0 0 1 0 0 1 1 0 1 1 1 
    0 0 0 1 0 0 1 1 1 1 1 
    0 0 0 0 1 0 0 1 0 1 1 

>> A = adjcombs(6) 
A = 

    0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 
    0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 1 1 0 1 1 1 
    0 0 0 1 0 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 1 1 
    0 0 0 0 1 0 0 0 0 1 1 0 0 1 1 1 1 1 1 1 1 1 
    0 0 0 0 0 1 0 0 0 0 1 1 0 0 1 1 0 1 1 1 1 1 
    0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 1 0 1 1 
+0

OPの質問を編集してコメントに書いたコードを追加しましたが、すでにOPの質問に対する完全な解決策を提示しているようです。なぜ彼があなたの答えを受け入れていないのか分かりません。 –

+0

多くのビーカーがあります。できます :) – Amigo

関連する問題