2016-07-15 10 views
2

から個々のグリッドを連結:傾きや一般的な方法で、私は次のことをやろうとしている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]の場合のために多くの方法でこの問題を解決することができますが、私はより多くのベクトルを取得するときに苦労し始めます。それを直接作り直しても正しい結果は得られません。また、任意の次元数を持つときには、置き換えをpermuteと組み合わせるのは本当に難しくなります。

xに3〜30個のベクトルにスケールされたこれを行う巧妙な方法はありますか?

答えて

1

cellfunを使用すると、セル配列要素のそれぞれを平坦化し、2番目の次元に沿ってそれらを連結することができます。

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

代わりに、あなたはcellfunを避け、各cell_gridメンバーのディメンション(すなわちnumel(x) + 1)より1高い次元に沿ってそれらを連結できます。次にreshapeを使用して、すべてのディメンションを連結しますが、連結した最後のディメンションは平準化します。

out = reshape(cat(numel(x) + 1, cell_grid{:}), [], numel(x)); 
関連する問題