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 comentarios

Jan
Jan el 30 de Jul. de 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 el 30 de Jul. de 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.

Iniciar sesión para comentar.

 Respuesta aceptada

Guillaume
Guillaume el 30 de Jul. de 2018

1 voto

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.

Más respuestas (1)

Stephen23
Stephen23 el 30 de Jul. de 2018
Editada: Stephen23 el 30 de Jul. de 2018

1 voto

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:

Categorías

Más información sobre Operators and Elementary Operations en Centro de ayuda y File Exchange.

Preguntada:

W K
el 30 de Jul. de 2018

Editada:

el 30 de Jul. de 2018

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by