Sometimes I need to construct a matrix with certain symmetries. There are a bunch of tools in MATLAB that are well suited for such tasks. In today's post, I will mention the ones I use most often.
I want to start with perhaps the most ignored funtionality for ensuring symmetry of a certain kind is the transpose operators .' (ctranspose) and ' (transpose). The reason these can be so so helpful is that during the construction of a matrix A, that we know should be symmetric (such as a covariance matrix) or hermetian (such as a hessian), the corresponding elements A(i,j) and A(j,i) may be computed with different expressions, or with the terms being aggregated in different orders. If that happens, these elements may differ due to numerical considerations. However, if the next step in the algorithm requires A to be symmetric, then the code may fail. So, to ensure symmetry, assuming A is real, you can do something like this:
A = (A + A')/2
Of course, another thing you might do is only calculate the elements on the diagonal and either above or below, and then fill in the remaining elements. A third, strategy, if you have control of the algorithm following the matrix construction, is to only use the upper or lower triangular elements, reducing the need to symmetrize the input.
There are other kinds of symmetries that arise in numerical computations. One example is for windowing signals for certain signal processing applications. In this case, the window that is applied is generally symmetric, but in a different way. For a window W of length n, the symmetry can be expressed like this:
W(end:-1:(ceil(n/2)+1)) = W(1:floor(n/2))
NOTE: I was careful in the above expression to not copy the middle element of an odd-length array :-) !
If I had just computed the first half of the window (being careful about odd and even lengths), I could just use one of these functions to get the window symmetry instead of working out the expression above, using the : (colon) operator and some math.
Here's a list (likely not exhaustive) of other tools to help produce symmetric arrays.
And here's one I basically never use, because I find that I have to do a lot of special case coding if I do.
- squeeze - Remove singleton dimensions
When do you need and use symmetry? In what application? And how do you achieve that in your code. Let us know here.