How can I obtain all possible combinations of given vectors in MATLAB?

조회 수: 198 (최근 30일)
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
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
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
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)
M1 = 3×18
1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 5 5 5 6 6 6 5 5 5 6 6 6 5 5 5 6 6 6 12 12 12 12 12 12 13 13 13 13 13 13 14 14 14 14 14 14
[an, bn, cn] = ndgrid(a,b,c);
M2 = [an(:), bn(:), cn(:)]'
M2 = 3×18
1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 5 5 5 6 6 6 5 5 5 6 6 6 5 5 5 6 6 6 12 12 12 12 12 12 13 13 13 13 13 13 14 14 14 14 14 14
isequal(M1,M2) % same as combvec
ans = logical
1
[am, bm, cm] = meshgrid(a,b,c);
M3 = [am(:), bm(:), cm(:)]'
M3 = 3×18
1 1 2 2 3 3 1 1 2 2 3 3 1 1 2 2 3 3 5 6 5 6 5 6 5 6 5 6 5 6 5 6 5 6 5 6 12 12 12 12 12 12 13 13 13 13 13 13 14 14 14 14 14 14
isequal(M1,M3) % requires reshaping
ans = logical
0

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

stewpend0us
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
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
Steven Lord 2023년 3월 16일
As of release R2023a you can use the combinations function in MATLAB for this task.
T = combinations(1:3, 4:6)
T = 9×2 table
Var1 Var2 ____ ____ 1 4 1 5 1 6 2 4 2 5 2 6 3 4 3 5 3 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
M = 9×2
1 4 1 5 1 6 2 4 2 5 2 6 3 4 3 5 3 6
The table output allows for mixing of types.
T = combinations(1:3, ["red", "blue", "green"])
T = 9×2 table
Var1 Var2 ____ _______ 1 "red" 1 "blue" 1 "green" 2 "red" 2 "blue" 2 "green" 3 "red" 3 "blue" 3 "green"

카테고리

Help CenterFile Exchange에서 Matrix Indexing에 대해 자세히 알아보기

제품


릴리스

R2007b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by