2016-10-05 9 views
2

マトリックスにいくつかの値を割り当てようとしています.2次元または3次元の場合、sub2indを使用するのは簡単です。しかし私が使用するデータは23の次元を持っています。例は、状況をよりよく説明できます。 Aは、3x4x5x6x7の次元を持つ行列です。リニアインデックスを使って何かをA(1,2,3,4,5)に割り当てたいと思います。私が欲しいものではなく、コンマの配列とsub2ind入力を割り当てることであるしかしMATLAB:線形インデキシングマルチディメンジョン

A(sub2ind(siz,1,2,3,4,5)) = any_var; 

:通常、それはのようなsub2indで可能です。 MATLABでこれを満たすものはありますか?

A(sub2ind(siz,[1 2 3 4 5])) = any_var; % I want something like this. 

答えて

5

インデックスは、あなたが(num2cellを使用して)セルに変換することができます

x = [1 2 3 4 5]; 

値とベクトルを定義し、それからcomma-separated listへ:

xc = num2cell(x); 
A(sub2ind(siz, xc{:})) = any_var; 

それとも、何ができます直接計算してsub2indを避けてください。線形インデックスに変換するには、k次元に沿ったインデックスから1を減算し、先行する次元のサイズの累積積を掛けます。すべてのkプラス1のため合計は線形インデックスです:

A(x(1) + sum((x(2:end)-1).*cumprod(siz(1:end-1)))) = any_var; 
+0

はそれが速くますか? (第2の解決策) –

+1

@toygankılıç私はそうだと思います。しかし、あまり読みにくい –

+0

「カンプロード」のアイデアは私にぴったりです。私は2次元配列の行をスカラーに崩壊させ、1次元配列を与え、各行は、n-dimグリッドにマッピングされたときに等価な線形インデックスを表すと仮定されるという同じ戦略を使用しました。 colsのだから、NumPyでは狂気のような1ライナーになるでしょう: 'a.dot(np.append(a.max(0)+1)[:0:-1] .cumprod()[:: - 1]、 1)) '!その索引付け部分 '[:0:-1]'は病気だと思った;) – Divakar

関連する問題