Finding all possible combinations of a matrix
显示 更早的评论
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
采纳的回答
更多回答(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 个评论
Guillaume
2015-11-17
This is hardly generic to any input mat of an arbitrary size
sameh eldessoki
2015-11-17
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
类别
在 帮助中心 和 File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!