2016-04-04 77 views
0

n boyutlu matris M boyutlarında, endeksleri içeren V numaralı bir vektörü geçirerek değerlere erişmem/düzenlemem gerekiyor.Oktav: Bir vektördeki indeksleri geçirerek matrisin değerine erişme?

2 vermelidir M(V1)4
ve M(V2) vermelidir
M = [ 1,2,3; 4,5,6; 7,8,9;];

endeks vektörler artık

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

, olsun;

sorun n sabit değildir ve N sütunlu bir matris kabul ederek M(idx_1,idx_2,...idx_n)

+1

[kullanmak ' sub2ind' (http://octave.sourceforge.net/octave/function/sub2ind.html) işlevi – Dan

+1

'' nı '' kullanarak '' n '' düzelmediyse yeterli değildir. For döngüsü olmadan 'n' işlemek için hile, daha sonra virgülle ayrılmış bir liste oluşturmak için kullanılabilecek bir hücre dizisi oluşturmaktır. – carandraug

+0

@Dan Bir vektörü nasıl argüman olarak geçirirsiniz? Sub2ind() '.ie' sub2ind ([3,3], V1) 'çalışmıyor. 'V1 = [2,1] '; – shadowfox

cevap

3

Birçok fonksiyonları gibi erişim değerlerine K boyutları kolu döngü yapmak isteyen kalmamasıdır. Bununla birlikte, diğerleri, bunun yerine N argümanlarını geçirmenizi gerektirir.

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 

N boyutlarını ele ana hüner comma separated lists (cs-lists) anlamaktır ve nasıl get them from cell arrays yapabilirsiniz: İşte size özgü sorunu çözmek için gereken sub2ind davası (doğrusal endeksleri içine indis indeksleri dönüştürmek) 'dir. sizinki gibi bir 2D örneği kullanarak (ancak v1 ve v2 saçma görmezden --- her satır bir nokta bir matris v kullanmalı ve her sütun bir boyuttur), yapabileceğiniz:

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

    2 
    4 

octave> M(ind) 
ans = 

    5 
    9 

sadece

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 

Ve gerçekten N boyutlarını ele geçirmek için kullanabilir: yukarıdaki örnekte izah edilmesi gerektiğinde şeydir

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 
İlgili konular