2012-01-18 1 views
2

次元LxLxL..xLの行列の要素のインデックス[x1 x2 ... xd]を返すことができる必要があります。次元数dは、私の関数に与えられる変数です。行列は存在せず、代わりに長さL^dの線形配列があります。配列内の与えられたインデックスiに対して、私は行列内の等価なインデックスを知りたいと思います。私はすでに単純なforループを使ってこれを行うことができますが、ind2subを何とか使うことができるかどうか知りたいのです。私が持っている問題は、私がしなければ可変次元行列の添え字を返す

x=zeros(1,d) 
x=ind2sub(L,i) 

xは、単一の番号ではなく、すべての添字の配列を再割り当てされていることです。これを行う方法はありますか?

答えて

6

「インデックス[x1 x2 ... xd]」とは、同等のd次元配列の各次元に沿った添字を意味します。

Lとdを次元配列に変換し、ind2subから複数の引数を取り込む必要があります。これを行う関数があります。 x = myind2sub(L, d, i)のように呼び出すことができます。

function out = myind2sub(L, d, ix) 

sz = repmat(L, [1 d]); %// dimension array for a d-dimension array L long on each side 
c = cell([1 d]); %// dynamically sized varargout 
[c{:}] = ind2sub(sz, ix); 
out = [c{:}]; 

しかし、あなただけではなく、最初の場所で多次元配列に格納する、リニアアレイに格納し、添字を計算しているなぜあなたも問うべき。 Matlabでは、多次元配列は連続したメモリブロックに格納されるため、効率的です。多次元添字または線形インデックスを使用してインデックスを作成できます。線形配列を使用している場合は、reshape(myarray, sz)を呼び出して、それを多次元対応するものに変換してください。

+0

ありがとうございます!これは、次元の複数の変更を伴うシミュレーションの一部です。 – Ivan

+0

あなたは単に 'reshape()'を使うかもしれません。 mxarrayヘッダーのディメンションメタデータが単調に変わるので安いです。基礎となるデータはそのままメモリに残されます。効果的に、Matlabの配列サポートはすでにこのようなことを行い、ユーザーコードでそれを再実装することはおそらくコードを遅くするでしょう。 –

+0

とても賢い。ありがとうありがとう。 – Frederick

関連する問題