拉直并连接来自 ndgrid 的各个网格
Straighten and concatenate the individual grids from ndgrid
我正在尝试以一般方式执行以下操作:
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 个向量吗?
您可以使用 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));
我正在尝试以一般方式执行以下操作:
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 个向量吗?
您可以使用 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));