2016-07-15 1 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 

나는 다음과 같은 방법을 시작해야 생각을하지만 난 방법을 알아낼 수 없습니다 나는 세 개의 변수 [a, b, c],와 루프없이 모두 경우에 대한 여러 가지 방법으로이 문제를 해결할 수

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 

,하지만 난 더 벡터를 얻을 때 투쟁을 시작합니다 계속합니다. 직접 고치면 올바른 결과를 얻을 수 없으며 임의의 개수의 치수가있을 때 permute와 혼합 모양을 변경하는 것은 실제로 힘들어집니다.

x에 3 ~ 30 개의 벡터로 조정할 수있는 영리한 방법이라고 생각하세요?

답변

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)); 
관련 문제