How can I obtain all possible combinations of given vectors in MATLAB?
187 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
MathWorks Support Team
am 10 Sep. 2012
Bearbeitet: MathWorks Support Team
am 19 Apr. 2023
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]
Akzeptierte Antwort
MathWorks Support Team
am 14 Apr. 2023
Bearbeitet: MathWorks Support Team
am 19 Apr. 2023
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 Kommentare
Adam Danz
am 25 Jul. 2018
+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
am 7 Dez. 2021
Bearbeitet: Adam Danz
am 7 Dez. 2021
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
Weitere Antworten (2)
stewpend0us
am 30 Jan. 2017
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 Kommentar
Rik
am 19 Jul. 2017
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
am 16 Mär. 2023
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 Kommentare
Siehe auch
Kategorien
Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!