2016-04-04 13 views
0

インデックスを含むベクトルVを渡すことによって、n次元行列Mの値にアクセス/編集する必要があります。Octave:ベクトルにインデックスを渡して行列から値にアクセスしますか?


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

インデックスベクトルが今

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

こと2を与える必要があり、M(V1)4
M(V2)を与える必要がありましょう。

問題がnが固定されていないと私はN列の行列を受け入れることによってM(idx_1,idx_2,...idx_n)

+1

は '[を使用します'sub2ind'](http://octave.sourceforge.net/octave/function/sub2ind.html)の機能 – Dan

+1

' n2'が本当に修正されていない場合、 'sub2ind'を使っては不十分です。 forループなしで 'n'を処理するトリックは、コンマで区切られたリストを作成するために使用できるセル配列を作成することです。 – carandraug

+0

@Dan 'sub2ind()'の引数としてどのようにベクトルを渡しますか.ie 'sub2ind([3,3]、V1)'は動作しません。 'v1 = [2,1]'; – shadowfox

答えて

3

多くの機能のようなアクセス値にN次元を扱うループ行いたくないです。しかし、多くの場合、N個の引数を渡す必要があります。

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の寸法を処理するための主なトリックがcomma separated lists (cs-lists)を理解しているとどのようにあなたがget them from cell arraysをすることができます:それはあなたの特定の問題を解決するために必要なsub2indの場合(線形インデックスへの添字インデックスを変換する)です。 、あなたが行うことができます(あなたは各行がポイントであり、各列は次元で行列vを使用する必要があります---が、あなたのv1v2ナンセンスを無視して)あなたのような2Dの例を使用する:

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

    2 
    4 

octave> M(ind) 
ans = 

    5 
    9 

のみ上記の例で説明する必要がある必要があるものです:

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 

そして、あなたが本当にNの寸法を処理するためにこれを使用することができます:

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 
関連する問題