2017-11-16 8 views
0

のすべての可能な0と1の行列が良く、私は必要なものを説明するために、ここで私の最初のコードです:通常のグラフ

function allpos = f1(x) 
allpos=reshape(permute((dec2base(0:power(2,x*x)-1,2)-'0'),[3 2 1]),x,x,[]); 

このコードは、私はそれが必要なものを正確に行います。ユーザーがf1(2)を入力すると、[0 0; 0 0]から[1 1; 1 1]までのすべての行列が返されます。しかし、それはまた私に多くの無駄な行列を与える。私は、対角線上にミラーリングされた行列だけを、対角線上には唯一ゼロが必要です。

さらに簡単に言えば、f1(3)の場合、私はほしいと思うだけです。 [0 0 0; 0 0 0; 0 0 0]から[0 1 1; 1 0 1; 1 1 0]です。つまり、私が新しいを実行する場合は、f1(3); 512ではなく8個の行列を返します。

これを行うには関数を書き直すにはどうすればよいですか?私はそれが三角行列とその転置された自己のいくつかの並べ替えを必要とすることを知っていますが、私はそれを一緒に詰めることはできません。ありがとう!

答えて

0

これはおそらくもっと簡潔にすることができますが、次のことはあなたが求めるものです。

function allpos = f1(x) 
N = (x-1)*x/2; 
z = permute(dec2base(0:power(2,N)-1,2)-'0',[3 2 1]); 
allpos = zeros(x,x,power(2,N)); 
idx = repmat(logical(tril(ones(x),-1)),[1,1,power(2,N)]); 
allpos(idx) = z(:); 
allpos = permute(allpos,[2 1 3]); 
allpos(idx) = z(:); 
+0

パーフェクト!ありがとうございました。 – CharlesLyleLarue

0

似た@ jodagの1の解決策が、より簡潔な...

function allops=f1(x) 
allops=zeros(x,x,2^(sum(1:x-1))); 
allops(find(triu(ones(x),1))+x^2*(0:2^(sum(1:x-1))-1))=[dec2base(0:2^(sum(1:x-1))-1,2)-'0'].'; 
allops=allops+permute(allops,[2 1 3]) 
end 
+0

このコードの唯一の問題は、反射が最終行列に正しく取り込まれないことです。たとえば、これは[0 0 1;の最終行列を返します。 1 0 1; 1 0 0]ではなく[1 0 0] 0 0 1; 1 1 0]。ありがとうございました! – CharlesLyleLarue

+0

これは、対称性をどのように定義するかによって異なります。私の編集を見る – Adiel