2014-07-22 42 views
1

我想知道是否有辦法爲2個向量生成所有可能的排列。我知道我可以使用燙髮,但這隻適用於一個向量。爲2個向量生成所有可能的排列

我想什麼是輸入矢量[1 2 3] 並會走出

V1 = []  V2 = [1 2 3] 
V1 = [1 2 3] V2 = [] 
V1 = [1]  V2 = [2 3] 
V1 = [2]  V2 = [1 3] 
... 

也可以予所有這些排列的存儲在一個單元陣列監守它們都具有不同的長度,以便一矩陣不起作用。

+0

你需要所有的排列或所有可能的分裂嗎?那你是否需要'[1],[2 3]'以及'[1],[3 2]',或者其中一個就足夠了? – Shai

+0

是的,我只需要其中之一。對不起,我應該清楚, –

回答

4

這是你想要的嗎?

output = {}; 
v = [1 2 3]; % input 
N = length(v); 
for k=1:2^N 
    m = logical(bitget(k, 1:N)); % mask selecting elements of v1 
    v1 = v(m); 
    v2 = v(~m); 
    output{end+1} = {v1, v2}; 
end 
+0

...我得到錯誤。但似乎是一個好主意。 – thewaywewalk

+0

你會得到什麼錯誤?這個對我有用。 – seb

+0

那麼,對於我的版本(2014a)'bitget'返回雙打,你不能直接用於索引。我編輯了這一行以使您的代碼更加健壯。奇怪它適合你,你有什麼版本? – thewaywewalk

0

嘗試使用以下溶液:

a=num2cell(1:3); 
output1=cellfun(@(x) nchoosek(1:3,x),a,'UniformOutput',false); 
output_reverse=cellfun(@(x) nchoosek(3:-1:1,x),a(2:3),'UniformOutput',false); 

對於1,2,3序列,輸出將是如下:

output1{1}= 

    1 
    2 
    3 

output1{2}= 

    1  2 
    1  3 
    2  3 

output1{3}= 

    1  2  3 

僅執行output_reverse線時您所需要的反向組合也。希望這是你正在尋找的。

1

在幾乎一行中,功勞應該去seb雖然。

v = [1 2 3 4]; 
N = numel(v); 

out = cellfun(@(x) {v(x) v(~x)}, mat2cell(logical(bsxfun(@bitget,(1:2^N)', (1:N))) ,ones(1,2^N),N) , 'uni', 0) 

我老的答案,笨拙,但工作原理:

A = arrayfun(@(x) nchoosek(V,x), 1:numel(V), 'uni',0); 
B = cellfun(@(x) mat2cell(x,ones(1,size(x,1)),size(x,2)),A,'uni',0); 

V1 = vertcat({[]},B{:}); 
V2 = cellfun(@(x) setdiff(V,x), V1, 'uni',0); 

給出:

>> celldisp(V1) 

V1{1} = 
    [] 
V1{2} = 
    1 
V1{3} = 
    2 
V1{4} = 
    3 
V1{5} = 
    1  2 
V1{6} = 
    1  3 
V1{7} = 
    2  3 
V1{8} = 
    1  2  3 

V2右相反。

+0

無論如何可以擴展它以便它可以將一個向量的所有排列生成爲3或4個向量嗎? @thewaywewalk –

+0

@AustenNovis不採用這種方法。 – thewaywewalk

+0

關於如何開始這樣的事情的任何提示? –

0

對所有可能的分區使用循環。對於每個分區,計算一個掩碼(邏輯索引),以指示哪些元素轉到V1,哪些轉到V2。以下假設順序並不重要,即[1],[2 3][1], [3 2]的分區相同。

vector = [1 2 3]; %// example data 
N = numel(vector); %// number of elements 
NN = 2^N; %// number of results 
V1 = cell(1,NN); %// intiallize 
V2 = cell(1,NN); %// intiallize 
for n = 0:NN-1; 
    mask = logical(dec2bin(n,N)-'0'); %// logical index for values in V1 
    V1{n+1} = vector(mask); 
    V2{n+1} = vector(~mask); 
end 
相關問題