How can I obtain all possible combinations of given vectors in MATLAB?
    43 ビュー (過去 30 日間)
  
       古いコメントを表示
    
    MathWorks Support Team
    
 2012 年 9 月 10 日
  
    
    
    
    
    編集済み: MathWorks Support Team
    
 2023 年 4 月 19 日
            I want to obtain all possible combinations of a set of vectors. For example, if
a=1:3; b=4:5
I want to generate the following vector:
C=[1 4;...
1 5;...
2 4;...
2 5;...
3 4;...
3 5]
採用された回答
  MathWorks Support Team
    
 2023 年 4 月 14 日
        
      編集済み: MathWorks Support Team
    
 2023 年 4 月 19 日
  
      There are several ways to obtain all possible combinations of a set of vectors.
a) If the set consists of 2 vectors, a and b, you can execute the following code:
[A,B] = meshgrid(a,b);
c=cat(2,A',B');
d=reshape(c,[],2);
b) If the set consists of 2 or more vectors, you can use the Neural Network Toolbox function COMBVEC to achieve the desired result. More information about COMBVEC function can be obtained form the following link:
c) If Neural Network Toolbox is not available, you can achieve the desired result from MATLAB Central file exchange* function through the following link:
*Note that MathWorks does not guarantee or warrant the use or content of these submissions. Any questions, issues, or complaints should be directed to the contributing author.
2 件のコメント
  Adam Danz
    
      
 2018 年 7 月 25 日
				+1 To add to this...
to avoid repeat combinations in the form of [20 30; 30 20]
d = unique(sort(d,2), 'rows')
And to remove self-combinations such as [20 20]
d(d(:,1)==d(:,2),:) = []
  Adam Danz
    
      
 2021 年 12 月 7 日
				
      編集済み: Adam Danz
    
      
 2021 年 12 月 7 日
  
			Note that ndgrid provides more compatible results with combvec, rather than using meshgrid. 
a = 1:3;
b = 5:6;
c= 12:14;
M1 = combvec(a,b,c)
[an, bn, cn] = ndgrid(a,b,c); 
M2 = [an(:), bn(:), cn(:)]'
isequal(M1,M2) % same as combvec
[am, bm, cm] = meshgrid(a,b,c); 
M3 = [am(:), bm(:), cm(:)]'
isequal(M1,M3) % requires reshaping
その他の回答 (2 件)
  stewpend0us
      
 2017 年 1 月 30 日
        This worked for me (probably the same thing that's going on in the "ALLCOMB" function that was suggested):
 elements = {1:2, 3:5, 6:7, 8:10}; %cell array with N vectors to combine
 combinations = cell(1, numel(elements)); %set up the varargout result
 [combinations{:}] = ndgrid(elements{:});
 combinations = cellfun(@(x) x(:), combinations,'uniformoutput',false); %there may be a better way to do this
 result = [combinations{:}]; % NumberOfCombinations by N matrix. Each row is unique.
1 件のコメント
  Rik
      
      
 2017 年 7 月 19 日
				Thanks, it took quite some effort to find this answer. I'm glad I don't have to hack something with a decision tree or n nested loops...
  Steven Lord
    
      
 2023 年 3 月 16 日
        T = combinations(1:3, 4:6)
While combinations does return a table, if the data in all of the inputs are compatibly typed you can extract the contents of the table as a matrix in one line.
M = combinations(1:3, 4:6).Variables
The table output allows for mixing of types.
T = combinations(1:3, ["red", "blue", "green"])
0 件のコメント
参考
カテゴリ
				Help Center および File Exchange で Matrix Indexing についてさらに検索
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!




