将 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 中的 allcomb
或
combvec
(深度学习工具箱)。它们都已经 return 一个矩阵,无需将元胞数组拼接在一起。
我想从向量 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 中的 allcomb
或
combvec
(深度学习工具箱)。它们都已经 return 一个矩阵,无需将元胞数组拼接在一起。