How can I generalise this?
Show older comments
I made this code;
x = [0 1]'; y = [0 1]';
m = 2; n = 1;
cell = {x, x, y}; % 2 x and 1 y
[a_1 a_2 b_1] = ndgrid(cell{:});
a_1 = a_1(:); a_2 = a_2(:);
b_1 = b_1(:);
But if I generalise this, by assigning x, y, m, n,
How can I make ... parts?
cell = {x, ... , x, y, ... , y}; % m Xs and n Ys
[a_1 a_2 ... a_m b_1 ... b_n] = ndgrid(cell{:});
a_1 = a_1(:); ... a_m = a_m(:);
b_1 = b_1(:); ... b_n = b_n(:);
Thanks to all!
2 Comments
Jan
on 30 Jul 2018
For the problem concerning hiding indices in the names of variables see Why and how to avoid eval. I will not post a solution, because this method is known to cause more troubles, than it solves.
Guillaume
on 30 Jul 2018
In addition to Jan's comment, do not name your variable cell, since it will prevent you from using the cell function.
Numbered variables are always an indication that your design is wrong. You should never have variables a_1, a_2, ... Instead you should have just one a variable (a cell array, a matrix, whatever is appropriate) that you index, e.g. a(1), a(2), ... With that design the ndgrid assignment is trivial.
Accepted Answer
More Answers (1)
This is easy when you sensibly store data in one array:
>> x = [0,1];
>> y = [0,1];
>> c = {x,x,y};
>> d = cell(size(c));
>> [d{:}] = ndgrid(c{:});
>> d = cellfun(@(m)m(:),d,'uni',0);
>> d{:}
ans =
0
1
0
1
0
1
0
1
ans =
0
0
1
1
0
0
1
1
ans =
0
0
0
0
1
1
1
1
I recommend putting the output into one numeric matrix:
>> M = [d{:}]
M =
0 0 0
1 0 0
0 1 0
1 1 0
0 0 1
1 0 1
0 1 1
1 1 1
or without the cellfun call:
>> [d{:}] = ndgrid(c{:});
>> M = reshape(cat(3,d{:}),[],numel(d))
M =
0 0 0
1 0 0
0 1 0
1 1 0
0 0 1
1 0 1
0 1 1
1 1 1
See:
Categories
Find more on Operators and Elementary Operations in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!