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
mit den Tasten [ ' sub2ind'] (http://octave.sourceforge.net/octave/function/sub2ind.html) Funktion – Dan
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
@Dan Wie übergeben Sie einen Vektor als Argument in 'sub2ind()' .ie 'sub2ind ([3,3], V1)' funktioniert nicht. 'v1 = [2,1]'; – shadowfox