Вот одно из возможных решений. Я был бы очень рад услышать о более простых подходах.
function grid_array = ndgridarr(n, varargin)
assert(length(varargin) == 1 || length(varargin) == n);
grid_cells = cell(1, n);
[grid_cells{:}] = ndgrid(varargin{:});
grid_array = cell2mat(cellfun(@(c) c(:), grid_cells, 'UniformOutput', false));
end
Вы можете вызывать эту функцию точно так же, как ndgrid
, только с дополнительным входным параметром n. (ngrid
автоматически выводит n из числа выходных аргументов в случае, когда предоставляется только один вектор, но мы не можем этого сделать, поскольку в любом случае у нас есть только один выходной параметр.)
Два примера, иллюстрирующие что он делает то, что хотел:
>> ndgridarr(3, [1,2,3])
ans =
1 1 1
2 1 1
3 1 1
1 2 1
2 2 1
3 2 1
1 3 1
2 3 1
3 3 1
1 1 2
2 1 2
3 1 2
1 2 2
2 2 2
3 2 2
1 3 2
2 3 2
3 3 2
1 1 3
2 1 3
3 1 3
1 2 3
2 2 3
3 2 3
1 3 3
2 3 3
3 3 3
>> ndgridarr(3, [1,2], [3,4], [5,6])
ans =
1 3 5
2 3 5
1 4 5
2 4 5
1 3 6
2 3 6
1 4 6
2 4 6