从ndgrid拉直并连接各个网格

时间:2016-07-15 21:11:47

标签: matlab cell reshape

我正在尝试以一般方式执行以下操作:

x = {0:1, 2:3, 4:6};
[a,b,c] = ndgrid(x{:});
Res = [a(:), b(:), c(:)]
Res =
   0   2   4
   1   2   4
   0   3   4
   1   3   4
   0   2   5
   1   2   5
   0   3   5
   1   3   5
   0   2   6
   1   2   6
   0   3   6
   1   3   6

我相信我必须从以下方式开始,但我无法弄清楚如何继续:

cell_grid = cell(1,numel(x));
[cell_grid{:}] = ndgrid(x{:});
[cell_grid{:}]
ans =    
ans(:,:,1) =
   0   0   2   3   4   4
   1   1   2   3   4   4
ans(:,:,2) =
   0   0   2   3   5   5
   1   1   2   3   5   5
ans(:,:,3) =
   0   0   2   3   6   6
   1   1   2   3   6   6

对于具有三个变量[a, b, c]的情况,我可以通过多种方式解决这个问题,包括有和没有循环,但是当我得到更多向量时,我开始挣扎。直接重塑它不会给出正确的结果,当我有任意数量的维度时,混合重塑与置换变得非常困难。

你能想到一个聪明的方法,可以在x中扩展到3-30个向量吗?

1 个答案:

答案 0 :(得分:1)

您可以使用cellfun展平每个单元格数组元素,然后沿第二维连接它们。

tmp = cellfun(@(x)x(:), cell_grid, 'uniformoutput', false);
out = cat(2, tmp{:})

或者,您可以避免cellfun并沿着比每个cell_grid成员的维度(即numel(x) + 1)高一维的维度连接它们。然后reshape展平所有尺寸,但最后一个尺寸,你刚刚连接起来。

out = reshape(cat(numel(x) + 1, cell_grid{:}), [], numel(x));