2016-01-03 17 views
5

私はバイナリ行列のすべての組み合わせを取得する簡単な方法を探しています。私はすでに関数perms()を試しましたが、適切な結果が得られませんでした。Matlab:バイナリ行列のすべての組み合わせ

私は、例えば行列N x Nが1と-1で埋められています。 Nと2 = 1の2^4の可能な組み合わせが存在することになると-1

 (1 1)   (1 1)   (-1 -1) 
M(1) = (1 1) , M(2) = (1 -1) , M(3) = (1 1) and so on... 

私はパーマを(使用)のようなIは、例えば、第1の行列を得ることはありません。

どうすれば修正できますか?次のように

答えて

5

を見つけたあなたは二進数として02^(N^2)-1間のすべての数字を表し、その後、再形成できると思う:

N = 2; 
v = (1:2^(N^2))-1; 
A = dec2bin(v)' - '0'; %'// Or use: decimalToBinaryVector(v)'; 
A(A==0) = -1; 
A = reshape(A,N,N,2^(N^2)); 
+0

なぜdownvote?もし私が間違っていたら、なぜ –

+1

が最初の行の誤字( '2^N-1'ではなく' 2^N-1')を除いて、私にはうまく見えますか?さらに、このアプローチでは、あなたの行列と '0:2 ^N²-1'の間に1対1の対応を与えるので、これらの組み合わせをすべてメモリに格納するよう強制しないことを指摘したいと思います。たとえば、これらの行列のうちの1つをランダムに取得するには、数を選択して等価を適用することができます。 – BillBokeey

+1

同じことが私に起こりました!私たちは学び、戦うためにここにいますか?あなたのケースでは、いくつかの重複した行列を削除する必要があります:@ NKN、 – NKN

-1

簡単ハックである:

もたらす
v = [1 -1 1 -1]; 
P = perms(v); 
for ii = 1:size(P,1) 
    A = reshape(P(ii,:),2,2) 
end 

A = 

    -1 -1 
    1  1 

... 

さらに除去されるべき結果で一部同じ行列が存在します。

+1

あなたのアプローチで、私はしないでください2つ以上の1または-1の行列を得る。 – Samuel

+0

2つの '-1'と2つの' 1'を組み合わせた行列だけが得られます。重複を削除するには、重複を排除するために 'P = unique(P、 'rows')'という行を使用することをお勧めします。 – Adriaan

-1

私は私の問題への解決策に

L = 2; 
N = L^2; 
v = cell(N,1); 
for k = 1:N 
    v{k} = linspace(-1,1,2); 
end 

ne=numel(v); 
x=cell(ne,1); 
[x{1:ne,1}]=ndgrid(v{end:-1:1}); 
p=reshape(cat(ne+1,x{:}),[],ne); 

F = cell(length(p),1); 
for k=1:length(p) 
    F{k} = reshape(p(k,:),L,L); 
end 
+0

なぜdownvote?私のソリューションは間違っていますか? – Samuel

+0

2つのこと:人々はこれらのコードを自分自身でコピーする傾向があり、 'クリア'コールはすべてを駄目にするので、SOコードでは 'すべてクリア 'を使用しないでください。第2: 'p'は65536x16の倍数で、あなたの順列のために少し大きいようです。すべての望ましい並べ替えがそこにあるが、あまりにも頻繁に。あなたは私の考えた次元で少し外に出ました。 – Adriaan

+0

また、 'v'は同じ行列の16倍の16x1セルです:' [-1 1] '。その全体のループは、これらの2つの数字を書くのは難しい方法です。 (補足として、私はこの答えに投票しませんでした) – Adriaan