2016-07-15 22 views
2

Ich versuche, die folgenden in allgemeiner Weise zu tun:Begradigen und verketten die einzelnen Gitter aus 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 

Ich glaube, ich habe folgende Art und Weise zu starten, aber ich kann nicht herausfinden, wie man weiter:

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 

ich [a, b, c] dies in vielerlei Hinsicht für den Fall mit drei Variablen lösen kann, sowohl mit als auch ohne Schleifen, aber ich fange an zu kämpfen, wenn ich mehr Vektoren erhalten. Wenn Sie es direkt umformen, erhalten Sie nicht das richtige Ergebnis, und das Mischen von Umformungen mit Permutation wird wirklich schwierig, wenn ich eine beliebige Anzahl von Dimensionen habe.

Können Sie sich eine clevere Methode vorstellen, die auf 3-30 Vektoren in x skaliert?

Antwort

1

Sie können cellfun verwenden, um jedes Zellenarrayelement zu reduzieren und anschließend entlang der zweiten Dimension zu verketten.

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

Alternativ können Sie cellfun zu vermeiden und sie entlang der Dimension verketten, die eine höher ist als Ihre Abmessung jedes cell_grid Mitglied ist (das heißt numel(x) + 1). Dann reshape, um alle Dimensionen zu reduzieren, aber die letzte, die Sie gerade verkettet haben.