forループを使用する必要がないようにしたい場合は、これがおそらく最もクリーンな方法です。
indexCell = num2cell(indexmatrix, 1);
linearIndexMatrix = sub2ind(size(kDimensionalMatrix), indexCell{:});
finalTable = kDimensionalMatrix(linearIndexMatrix);
最初の行は、indexmatrix
を使用しての各列をセル配列の個別のセルに配置しnum2cell
ます。k
これにより、すべての列をコンマ区切りのリストとしてに渡すことができます。これは、添え字付きのインデックス(行、列など)を線形インデックスに変換sub2ind
する関数です(各行列要素には1からまでの番号が付けられます。これは、マトリックス)。最後の行では、これらの線形インデックスを使用してforループを置き換えています。行列の索引付け(添え字、線形、および論理)に関する適切な説明は、ここにあります。N
N
思考のためのもう少しの食べ物...
ベクトル化されたソリューションを支持してforループを敬遠する傾向は、多くのMATLABユーザー(私自身を含む)が慣れ親しんできたものです。ただし、新しいバージョンのMATLABは、ループをはるかに効率的に処理します。別のSOの質問に対するこの回答で説明したように、forループを使用すると、ベクトル化されたソリューションで得られるよりも高速に実行されるコードが生成される場合があります。
私は確かに、コードをベクトル化しようとすべきではないと言っているのではなく、すべての問題が固有であるということだけを言っています。多くの場合、ベクトル化の方が効率的ですが、常にそうとは限りません。あなたの問題では、forループとベクトル化されたコードの実行速度はおそらく値n
との大きさに依存しますk
。