How to| 更新矩阵的一部分
Wolfram 语言具有多种矩阵操作,这些操作支持矩阵的构建、计算及可视化等操作. 同时,它具有丰富的语言,可以对矩阵的一部分进行择取并赋予新值.
mat = Table[Subscript[m, i, j], {i, 5}, {j, 5}];
mat//MatrixForm在赋值式的左端使用 [[...]](Part 的简写形式)设置一个元素:
mat[[1, 2]] = xmat//MatrixForm如对一整行进行设置,需使用一个索引值来指定行,并赋给一个新行:
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使用 Span 的简写形式 (;;) 指定所跨越的相关行与列,更新该子矩阵:
mat[[1 ;; 3, 1 ;; 4]] = {{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}};
mat//MatrixFormmat[[2 ;; -2, 2 ;; -2]] = {{-1, -1, -1}, {-1, -1, -1}, {-1, -1, -1}};
mat//MatrixForm当更新一个大型矩阵时,应该尽量避免使用循环语句. 如果能够使用其中一种更新技术,用一个指令更新所有的元素,速度通常会快得多:
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}];//AbsoluteTimingDo[b = mat;mat[[i, i + 1]] = 0.0, {i, 999}];//AbsoluteTiming