How can I generalise this?

1 view (last 30 days)
W K
W K on 30 Jul 2018
Edited: Stephen23 on 30 Jul 2018
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
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
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.

Sign in to comment.

Accepted Answer

Guillaume
Guillaume on 30 Jul 2018
As per my comment to your question: 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.
%demo data
x = [0 1]'; y = [1 0]';
m = 10; n = 7;
c = repelem({x, y}, [m, n]); %creates {x, ... , x, y, ... , y}; % m Xs and n Ys
[c{:}] = ndgrid(c{:}); %ndgrid
c = reshape(cat(m+n+1, c{:}), [], m+n);
a = c(:, 1:m);
b = c(:, m+1:end);
a(:, i) is your a_i, b(:, i) is your b_i.

More Answers (1)

Stephen23
Stephen23 on 30 Jul 2018
Edited: Stephen23 on 30 Jul 2018
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 Matrices and Arrays 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!