我想从向量xi创建一个n维网格,这些向量指定了维度I中所需的网格点。输出应该是单个n x n矩阵,其中n=b1*b2*b3**bn是网格点的总数,bi是沿该维度所需网格点的数量。(我想在Matlab中做这件事。(
我知道我可以使用ndgrid
函数来创建这个n维网格,但ndgrid
返回n个单元数组,每个数组的维数为b1xb2xb3x。。。xbn。如何根据需要将其转换为单个数组?
另一个复杂的问题是:我事先不知道维度n。
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
另一种选择是使用文件交换中的allcomb
或combvec
(深度学习工具箱(。它们都已经返回了单个矩阵,无需将单元阵列缝合在一起。
这里有一个可能的解决方案。我很乐意听到更简单的方法。
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