How to | 行列の部分を更新する方法
Wolfram言語には,行列の構築,計算,可視化等の操作をサポートする数多くの行列操作が含まれている.また,Wolfram言語は行列の一部を選び,それに新しい値を割り当てるための豊富な言語も兼ね備えている.
mat = Table[Subscript[m, i, j], {i, 5}, {j, 5}];
mat//MatrixForm割当ての左側に[[...]](Partの簡略表記)を使って要素を設定する:
mat[[1, 2]] = xmat//MatrixForm行全体を設定するためには,行を指定するのに1つの指数を使い,それを新しい行に割り当てる:
mat[[4]] = {1, 2, 3, 4, 5};
mat//MatrixForm列全体を設定するためには,Allですべての行を選び,列を指定する:
mat[[All, 4]] = {a, b, c, d, e};
mat//MatrixForm部分行列を設定するためには,Spanの簡略表記(;;)を使うとよい:
mat = RandomInteger[10, {5, 5}];
mat//MatrixFormここで色付けされている左上の3x4行列は行1から3および列1から4に対応する:
Spanの簡略表記(;;)を使って該当する行と列の範囲を指定し,色付けされた部分行列を更新する:
mat[[1 ;; 3, 1 ;; 4]] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
mat//MatrixForm一番外側の行と列以外の要素をすべて(負の指数は最後から数える)を更新する:
mat[[2 ;; -2, 2 ;; -2]] = {{-1, -1, -1}, {-1, -1, -1}, {-1, -1, -1}};
mat//MatrixForm大きな行列を更新する場合には,これをループを使って行うことは避けた方がよい.1つのコマンドを使ってすべての要素を更新するような更新技術の一つを使える場合には,通常その方がずっと速い.
mat = RandomReal[10, {5000, 5000}];Do[mat[[i, 1]] = 0.0, {i, 1, 5000}];//AbsoluteTimingmat[[All, 1]] = 0.0;//AbsoluteTiming行列をループでアップデートすることを避けられない場合は,行列をさらに参照することを避ける必要がある.そうしないと,行列はコピーされてループはあまり速く実行されなくなる:
mat = RandomReal[10, {1000, 1000}];以下で余分な参照を避けることができる.ループはかなり速く実行される:
Do[mat[[i, i + 1]] = 0.0, {i, 999}];//AbsoluteTiming以下では各ステップで行列のコピーが作成されるので,ループはあまり速く実行されない:
Do[b = mat;mat[[i, i + 1]] = 0.0, {i, 999}];//AbsoluteTiming