因此,我找到了一種方法來獲得您的組合。你應該給出一個更簡單的例子來解釋你的問題(這就是我通過這種方式解決問題的方法)。
的程序是:
- 獲取所有每組
{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
此答案[生成含有從n個向量獲得的元素的所有組合的基質(http://stackoverflow.com/questions/21895335/generate-a-matrix-包含所有從n元素組合中取得的元素)可以幫助你 – Hoki
@Hoki這個鏈接從每個向量中取1個元素我想要2個元素而不重複! –
這就是爲什麼Hoki說「可以幫助你」。您是否嘗試修改它以適合您的應用程序? –