2012-02-29 12 views
4

はのは、私は次の論理行列を持っていると仮定してみましょう取得:MATLAB:特定の論理行列のための全ての順列

log = [1 1 0; 
     0 1 1; 
     1 0 1; 
     0 0 1]; 

列はバスケットのようなものを説明し、単一の行は、特定の属性(例えばによって識別されるいくつかのオブジェクトを記述する異なる色のボール)をあなたはそれらのバスケットに入れることができます。 1は、(列で説明されたバスケットに)入れることができます。0を入れることはできません。

各バスケットには、同時に1つのオブジェクトしか入れることができません。 I want to have objects in basket 1 and 3 but none in basket 2, which would be [1 0 1]

だから私は次の可能性があります。

  • バスケット2:0項目を は、私が言うことを意味し、特定の構成のためのオブジェクトに配置する方法の順列を計算するためにどのように思ったんだけど
  • バスケット1:オブジェクト1またはオブジェクト2のいずれかを含むことができます。 3
  • バスケット3:オブジェクト2、objのいずれかを含むことができます。 3またはobj。 4

ので、すべてのすべてで、私は完全な順列を持っている(1行は、1つの順列を記述欄にはバスケットを説明し、数はオブジェクト記述):

1 0 2 
1 0 3 
1 0 4 
2 0 2 
2 0 3 
2 0 4 

どのようにこれを行うために任意の数のバスケットやオブジェクトに適応する素敵なアルゴリズムですか?私は、ネストされたと醜いループと考えることができます:( おかげでたくさん!

+1

最終回答の最初の欄に[1 1 1 2 2 2] 'の代わりに[1 1 1 3 3 3]'と表示されますか? – Oli

答えて

4

私は再帰的にそれを作ることになります。

function out = permlog(log,bag) 
if bag(1)==0 
    curr=0; 
else 
    curr = find(log(:,1)); 
end 
if size(log,2)==1 
    out = curr; 
    return 
else 
    add = permlog(log(:,2:end),bag(2:end)); 
    out = []; 
    for i=1:numel(curr) 
     tmp = [repmat(curr(i),size(add,1),1),add]; 
     out =[out;tmp]; 
    end 
end 

をあなたが記述の出力を与える:

今もファイル交換で何かを見つけ
permlog(log,[1,0,1]) 

ans = 

    1  0  2 
    1  0  3 
    1  0  4 
    3  0  2 
    3  0  3 
    3  0  4 
+0

大丈夫両方の両方の素晴らしいソリューションに感謝bdecaf – tim

5

をあなたはndgridを使用することができます。この機能は、あなたが探しているまさにありません。

[b1 b2 b3]=ndgrid([1 2],[0],[2 3 4]); 
[b1(:) b2(:) b3(:)] 

ans = 

1  0  2 
2  0  2 
1  0  3 
2  0  3 
1  0  4 
2  0  4 

をあなたに完全な質問に答えるために、あなたが必要とします

log = [1 1 0; 
    0 1 1; 
    1 0 1; 
    0 0 1]; 
log=bsxfun(@times,log,[1 0 1]); 
poss=cellfun(@find,mat2cell(log,size(log,1),ones(1,size(log,2))),'UniformOutput',0) 
poss(cellfun(@isempty,poss))={0} 
basket=cell(1,size(log,2)); 
[basket{:}]=ndgrid(poss{:}); 
basket=cell2mat(cellfun(@(x) x(:),basket,'UniformOutput',0)) 

バスケット=

1  0  2 
3  0  2 
1  0  3 
3  0  3 
1  0  4 
3  0  4 
:あなたのログ変数から [1 2],[0],[2 3 4]を取得します
+0

は興味深いですが、どのように正確に結果を任意の入力に合わせる必要がありますか? – tim

+0

Oliを編集してくれてありがとう、もっとバスケットがあるときにはどのように適応するのですか?私はプログラムされたステートメントで出力変数の数を動的に変更することはできません。 – tim

+0

もう一度感謝しますが、まだ2番目のコメントの質問が残っています。バスケットを追加すると、b1 ... b3はハードコードされているため、コードは自動的に適応できません。 – tim

関連する問題