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



我想从向量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

另一种选择是使用文件交换中的allcombcombvec(深度学习工具箱(。它们都已经返回了单个矩阵,无需将单元阵列缝合在一起。

这里有一个可能的解决方案。我很乐意听到更简单的方法。

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 

相关内容

  • 没有找到相关文章