2016-04-04 28 views
0

Ich muss auf Werte in einer n dimensionalen Matrix M zugreifen/bearbeiten, indem ich einen Vektor V übergebe, der Indizes enthält.Octave: Zugriff auf eine Matrix durch Übergabe von Indizes in einem Vektor?

lassen
M = [ 1,2,3; 4,5,6; 7,8,9;];

Indexvektoren

V1=[2,1]; V2=[1,2];

jetzt sein, sollte M(V1)4
und M(V2) geben 2 geben sollte;

Problem ist n nicht festgelegt ist, und ich möchte den Zugriff auf Werte wie M(idx_1,idx_2,...idx_n)

+1

mit den Tasten [ ' sub2ind'] (http://octave.sourceforge.net/octave/function/sub2ind.html) Funktion – Dan

+1

Verwendung von 'sub2ind' ist nicht genug, wenn' n' wirklich nicht behoben ist. Der Trick, 'n' ohne eine for-Schleife zu behandeln, besteht darin, ein Zellen-Array zu erstellen, das dann zum Erstellen einer kommagetrennten Liste verwendet werden kann. – carandraug

+0

@Dan Wie übergeben Sie einen Vektor als Argument in 'sub2ind()' .ie 'sub2ind ([3,3], V1)' funktioniert nicht. 'v1 = [2,1]'; – shadowfox

Antwort

3

Viele Funktionen Griff N Dimensionen durch die Annahme einer Matrix mit N Spalten nicht Looping. Bei vielen anderen müssen Sie jedoch N Argumente übergeben. Das ist der Fall von sub2ind (Index Indizes in lineare Indizes umwandeln), die Sie benötigen, um Ihr spezifisches Problem zu lösen:

octave> M = randi (9, 3) 
M = 

    2 9 4 
    5 9 5 
    2 6 4 

octave> ind = sub2ind (size (M), [2 1], [1 2]) # sub2ind (dims, rows, cols, 3rd_dim, 4th_dim, ...) 
ind = 

    2 4 

octave> M(ind) 
ans = 

    5 9 

Der wichtigste Trick N Dimensionen zu handhaben ist das Verständnis comma separated lists (cs-lists) und wie Sie get them from cell arrays. Mit Hilfe eines 2D-Beispiel wie das Ihre (aber Ihre v1 und v2 Unsinn ignorieren --- sollten Sie eine Matrix v verwenden, wobei jede Zeile ein Punkt ist und jede Spalten ist eine Dimension), können Sie tun:

octave> v = [2 1; 1 2]; 
octave> ind = sub2ind (size (M), num2cell (v, 1){:}) 
ind = 

    2 
    4 

octave> M(ind) 
ans = 

    5 
    9 

die einzige Sache, die im obigen Beispiel erläutert werden müssen, sollten ist:

octave> num2cell (v, 1) # returns a cell array 
ans = 
{ 
    [1,1] = 

    2 
    1 

    [1,2] = 

    1 
    2 

} 
octave> num2cell (v, 1){:} # transform the cell array into a cs-list 
ans = 

    2 
    1 

ans = 

    1 
    2 

Und Sie können dies wirklich N Dimensionen Griff verwenden:

octave> M = rand (9, 5, 5, 5, 5, 5); 
octave> v = [5 5 5 5 5; 1 2 3 4 5; 3 2 4 4 1]; 
octave> ind = sub2ind (size (M), num2cell (v, 1){:}); 
octave> M(ind) 
ans = 

    0.13726 
    0.14020 
    0.78660 

octave> [M(5, 5, 5, 5, 5); M(1, 2, 3, 4, 5); M(3, 2, 4, 4, 1)] 
ans = 

    0.13726 
    0.14020 
    0.78660