Finding all possible combinations of a matrix
Afficher commentaires plus anciens
Hello Everyone,
I have the following matrix:
mat=[0 0 0 0;1 1 1 1;2 2 2 2;3 3 3 3]
and i want to create a new matrix from it that would have all possible combinations: [ 0 0 0 0; 0 0 0 1; 0 0 0 2; 0 0 0 3; 0 0 1 0; 0 0 2 0; . . . ;3 3 3 3]
How can I do that?
Thanks a lot in advance
Best Regards, Sameh
Réponse acceptée
Plus de réponses (2)
val = 0:3;
X = [];
for i = val, for j= val, for k = val, for l = val, X = [X; [i,j,k,l]]; end, end, end, end
or
val = 0:3;
[w x y z] = ndgrid(val);
X = [z(:) y(:) x(:) w(:)];
2 commentaires
Guillaume
le 17 Nov 2015
This is hardly generic to any input mat of an arbitrary size
sameh eldessoki
le 17 Nov 2015
This will work as long as mat has less than 10 rows:
assert(size(mat, 1) < 10, 'mat has too many rows')
rowidx = dec2base(0 : size(mat, 1).^size(mat, 2)-1, size(mat, 1)) - '0' + 1;
colidx = repmat(1:size(mat, 2), size(mat, 1).^size(mat, 2), 1);
result = mat(sub2ind(size(mat), rowidx, colidx))
There's no limit on the number of columns (other than memory / computation time)
edit:
if more than 10 rows, then you can use ndgrid as per Thorsten's answer to generate the rowidx:
rowvals = cell(1, size(mat, 2)); %to receive output of ndgrid
[rowvals{:}] = ndgrid(1:size(mat, 1));
rowidx = reshape(cat(size(mat, 2)+1, rowvals{:}), size(mat, 1).^size(mat, 2), size(mat, 2));
%continue as before
1 commentaire
sameh eldessoki
le 17 Nov 2015
Catégories
En savoir plus sur Data Type Identification dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!