問題を説明するためにタイトルの文言を修正したかどうかはわかりません。以下の説明を反映するように自由に編集してください。
数独ソルバー プログラムがあり、入力行列が次のようになっているとします。
A = randi(10,[9,9])-1;
3x3 サブマトリックスに列ごとに 1 から 9 までのインデックスを付けます。このインデックスを表す変数nSubMatは、1 から 9 までの任意の値を取ることができるとします。
次の方法で部分行列にインデックスを付けます。
SubMat(nSubMat) = A((1:3)+(3*floor((nSubMat-1)/3)),(1:3)+(3*mod(nSubMat-1,3)));
ここで、最初に SubMat を作成する必要なく (不要なコピーを避けるために)、SubMat の (2x3) 位置の値にアクセスして変更したいと考えています。
詳しく説明すると、上記を実装する関数 submatrix() がある場合、ステートメントは次のようになります。
submatrix(A((1:3)+(3*floor((nSubMat-1)/3)),(1:3)+(3*mod(nSubMat-1,3))),[2,3]) = 5;
あるいは、
submatrix(A((1:3)+(3*floor((nSubMat-1)/3)),(1:3)+(3*mod(nSubMat-1,3))),[2:3,2:3]) = [1 2;3 4];
Matlab インタープリターが速度のために LHS=RHS 型の割り当てを自動的に最適化することは知っていますが、上記の行列演算は、コピーを減らしてコードを高速化するだけでなく、ここでは詳しく説明しませんが、(アルゴリズム的に) より多くの理由で重要です。Armadillo という C++ ライブラリで必要な構文を見たことがありますが、MATLAB で同じことができるかどうかはわかりません。