Elegant operations on matrix rows and columns
I like to use Part
even when I don't want to modify the original matrix. This of course requires making a copy but it keeps syntax more consistent.
adding column one to column three:
m = Range@12 ~Partition~ 3;
m // MatrixForm
$\left( \begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \\ 10 & 11 & 12 \end{array} \right)$
m2 = m;
m2[[All, 3]] += m2[[All, 1]];
m2 // MatrixForm
$\left( \begin{array}{ccc} 1 & 2 & 4 \\ 4 & 5 & 10 \\ 7 & 8 & 16 \\ 10 & 11 & 22 \end{array} \right)$
With an external vector:
v = {-1, -2, -3, -4};
m2 = m;
m2[[All, 3]] += v;
m2 // MatrixForm
$\left( \begin{array}{ccc} 1 & 2 & 2 \\ 4 & 5 & 4 \\ 7 & 8 & 6 \\ 10 & 11 & 8 \end{array} \right)$
swapping rows and columns:
m2 = m;
m2[[{1, 3}]] = m2[[{3, 1}]];
m2 // MatrixForm
$\left( \begin{array}{ccc} 7 & 8 & 9 \\ 4 & 5 & 6 \\ 1 & 2 & 3 \\ 10 & 11 & 12 \end{array} \right)$
m2 = m;
m2[[All, {1, 3}]] = m2[[All, {3, 1}]];
m2 // MatrixForm
$\left( \begin{array}{ccc} 3 & 2 & 1 \\ 6 & 5 & 4 \\ 9 & 8 & 7 \\ 12 & 11 & 10 \end{array} \right)$
Simultaneous row-and-column operations
Part is capable of working with rows and columns simultaneously(1).
We can operate on (or replace) a contiguous sub-array:
m2 = m;
m2[[3 ;;, 2 ;;]] /= 5;
m2 // MatrixForm
$\left( \begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & \frac{8}{5} & \frac{9}{5} \\ 10 & \frac{11}{5} & \frac{12}{5} \\ \end{array} \right)$
Or a disjoint specification:
m2 = m;
m2[[{1, 2, 4}, {1, 3}]] = 0;
m2 // MatrixForm
$\left( \begin{array}{ccc} 0 & 2 & 0 \\ 0 & 5 & 0 \\ 7 & 8 & 9 \\ 0 & 11 & 0 \\ \end{array} \right)$
Or construct a new array from constituent parts in arbitrary order:
mx = BoxMatrix[2] - 1;
mx[[{1, 2, 5, 4}, {4, 5, 1}]] = m;
mx // MatrixForm
$\left( \begin{array}{ccccc} 3 & 0 & 0 & 1 & 2 \\ 6 & 0 & 0 & 4 & 5 \\ 0 & 0 & 0 & 0 & 0 \\ 12 & 0 & 0 & 10 & 11 \\ 9 & 0 & 0 & 7 & 8 \\ \end{array} \right)$
Interchanging rows
This'll swap rows 1 and 3.
Permute[mat, Cycles[{{1, 3}}]]
To swap columns, you can convert the permutation to a permutation list,
permList = PermutationList[Cycles[{{1, 3}}], Last@Dimensions[mat]]
then use
mat[[All, permList]]
Multiplying rows
This'll multiply the 3rd row by 5:
MapAt[5 # &, mat, 3]
This'll change the matrix permanently:
mat[[3]] *= 5
For small matrices, using simple indexing might be more readable:
Interchanging rows:
m[[{1, 3, 2}]]
Multiplying rows:
m * {1,2,1}
Adding rows
m + {0,v,0}
For large matrices, you could use SparseArray
to generate the second matrix (less readable, but works for any matrix size and might be faster, too):
m * SparseArray[2 -> 2, Length[m], 1]
m + SparseArray[2 -> v, Length[m], 0]
Insert a row into a matrix
Insert[m, v, 2]
You might want to look at the Matrix and Tensor Operations tutorial, too