2015-05-02 204 views
1

我有4組每個包含6個元素,我想從中產生所有可能的8號大小的矢量,前兩個元素來自set1第2個來自set2來自第3個來自set3來自第2個來自set4在從每組取得的點上不重複,使得元素1,2/3,4/5,6/7,8總是不同的。我的目標號碼組合是(6choose2)^ 4。請任何幫助。使用MATLAB生成所有沒有重複的組合

D1=[2+2i,2+1i,1+2i,1+1i,2,1i]; 
    D2=[-2+2i,-2+1i,-1+2i,-1+1i,-1,2i]; 
    D3=[-2-2i,-2-i,-1-i,-1-1i,-2,-1i]; 
    D4=[2-2i,2-i,1-2i,-1+1i,1,-2i]; 
+0

此答案[生成含有從n個向量獲得的元素的所有組合的基質(http://stackoverflow.com/questions/21895335/generate-a-matrix-包含所有從n元素組合中取得的元素)可以幫助你 – Hoki

+0

@Hoki這個鏈接從每個向量中取1個元素我想要2個元素而不重複! –

+0

這就是爲什麼Hoki說「可以幫助你」。您是否嘗試修改它以適合您的應用程序? –

回答

1

因此,我找到了一種方法來獲得您的組合。你應該給出一個更簡單的例子來解釋你的問題(這就是我通過這種方式解決問題的方法)。

的程序是:

  • 獲取所有每組{2 element}獨特組合。
  • 然後建立您獲得的結果的索引。通常情況下,每個子集都應該有一個索引,但由於它們的長度都是相同的,因此唯一組合的數量將相同,因此您可以重複使用4倍的相同索引。
  • 獲取的這4組指標的所有組合
  • 最後,重建基礎上,指數最終矩陣組合

代碼看起來象:

%// prepare a few helper numbers 
nSets = 4 ; 
nElemPerSet = 2 ; 
nCombs = nchoosek(numel(D1) ,nElemPerSet).^nSets ; %// <= nCombs=50625 

%// for each set, get the unique combinations of 2 elements 
s1 = nchoosek(D1 , nElemPerSet) ; 
s2 = nchoosek(D2 , nElemPerSet) ; 
s3 = nchoosek(D3 , nElemPerSet) ; 
s4 = nchoosek(D4 , nElemPerSet) ; 

%// now get the index of all the combinations of the above subsets 
s = 1:size(s1,1) ; 
combindex = all_combinations(repmat({s},1,4)) ; %// <= size(combindex)=[50625 4] 

%// now rebuild the full combinations based on above indices 
combinations = zeros(nCombs , nSets*nElemPerSet) ; 
for ic = 1:nCombs 
    combinations(ic,:) = [s1(combindex(ic,1),:) s2(combindex(ic,2),:) s3(combindex(ic,3),:) s4(combindex(ic,4),:)] ; 
end 

有可能是一個辦法爲了擺脫最後一個循環的智能使用arrayfun,但我把它作爲練習給讀者。

此代碼適用於您的問題中描述的初始值D1, D2, D3 and D4,但如果您或任何人想要一步一步地運行它以瞭解發生了什麼,我強烈建議嘗試使用更簡單的起始值。喜歡的東西:

%// define 4 non-complex sets of 4 values each (all different) 
nVal=4 ; 
D1 = 1:nVal ; 
D2 = D1(end)+1:D1(end)+nVal ; 
D3 = D2(end)+1:D2(end)+nVal ; 
D4 = D3(end)+1:D3(end)+nVal ; 

注意使用功能all_combinations的。這只是我在評論中提到的答案(Generate a matrix containing all combinations of elements taken from n vectors)重新包裝在一個函數中。如果你經常遇到組合問題,我建議你看一看,並加上書籤。(如果它對你有幫助,你也可以加註它,它在這裏做)。

重新打包的功能是:

function combs = all_combinations(vectors) 
%// function combs = all_combinations(vectors) 
%// 
%// example input : 
%//  vectors = { [1 2], [3 6 9], [10 20] }; %//cell array of vectors 
%// 
%// Credit: Luis Mendo : https://stackoverflow.com/questions/21895335/generate-a-matrix-containing-all-combinations-of-elements-taken-from-n-vectors 

n = numel(vectors);    %// number of vectors 
combs = cell(1,n);    %// pre-define to generate comma-separated list 
[combs{end:-1:1}] = ndgrid(vectors{end:-1:1}); %// the reverse order in these two 
%// comma-separated lists is needed to produce the rows of the result matrix in 
%// lexicographical order 
combs = cat(n+1, combs{:});  %// concat the n n-dim arrays along dimension n+1 
combs = reshape(combs,[],n); %// reshape to obtain desired matrix