将 ndgrid 的输出转换为单个数组

Convert output of ndgrid to a single array

我想从向量 xi 创建一个 n 维网格,它在维度 i 中指定所需的网格点。输出应该是单个 N x n 矩阵,其中 N=b1*b2*b3*...*bn 是网格点的总数,bi 是该维度上所需的网格点数。 (我想在 Matlab 中做这个。)

我知道我可以使用 ndgrid 函数创建此 n 维网格,但是 ndgrid returns n 个元胞数组,每个维度为 b1xb2xb3x...xbn。如何根据需要将其转换为单个数组?

另外一个问题:我事先不知道维度 n。

这是一种可能的解决方案。我会 非常 很高兴听到更简单的方法。

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 

David 在他的评论中已经明白了,只是 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

另一种方法是使用 file exchange 中的 allcombcombvec(深度学习工具箱)。它们都已经 return 一个矩阵,无需将元胞数组拼接在一起。