How can I obtain all possible combinations of given vectors in MATLAB?
187 次查看(过去 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!