Преобразовать вывод ndgrid в один массив - PullRequest
1 голос
/ 17 марта 2020

Я хочу создать n-мерную сетку из векторов xi, которые задают нужные точки сетки в измерении i. Выходные данные должны представлять собой одну матрицу N xn, где N = b1 * b2 * b3 * ... * bn - общее количество точек сетки, а bi - количество требуемых точек сетки вдоль этого измерения. (Я хочу сделать это в Matlab.)

Я знаю, что могу использовать функцию ndgrid для создания этой n-мерной сетки, но ndgrid возвращает n массивов ячеек, каждый из которых имеет размер b1xb2xb3x .. .xbn. Как я могу преобразовать это в один массив, по желанию?

Дополнительное осложнение: я не знаю размер n заранее.

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

Дэвид уже получил идею в своем комментарии, просто небольшая ошибка для n> = 4.

function grid_array = ndgridarr(n, varargin)

    assert(length(varargin) == 1 || length(varargin) == n);

    grid_cells = cell(1, n);
    [grid_cells{:}] = ndgrid(varargin{:});

    grid_array = reshape(cat(n+1,grid_cells{:}),[],n);
end

Альтернативой является использование allcomb из обмена файлами или combvec (набор инструментов для глубокого обучения). Они оба уже возвращают одну матрицу, нет необходимости склеивать массив ячеек.

1 голос
/ 17 марта 2020

Вот одно из возможных решений. Я был бы очень рад услышать о более простых подходах.

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...