Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I have an $n\times n$ matrix G with elements g[i,j] that I construct with Table[g[i, j], {i, 1, n}, {j, 1, n}]

I have tried without success to write a code without loops in Mathematica that rearranges these elements to a vector in a certain way.

To illustrate the case $n=4$: $$ G=\begin{pmatrix} g[1,1]&g[1,2]&g[1,3]&g[1,4]\\g[2,1]&g[2,2]&g[2,3]&g[2,4]\\g[3,1]&g[3,2]&g[3,3] &g[3,4]\\g[4,1]&g[4,2]&g[4,3]&g[4,4]\end{pmatrix} \longrightarrow \begin{pmatrix} g[1,1]-g[2,2]\\g[2,2]-g[3,3]\\g[3,3]-g[4,4]\\g[1,2]-g[2,3]\\g[2,3]-g[3,4]\\g[2,1]-g[3,2]\\g[3,2]-g[4,3] \end{pmatrix} = \widetilde{G} $$

I.e, I'm trying to find a way to create a vector where every element is a subtraction between two diagonally consecutive elements in $G$, starting on the central diagonal, working its way to the right and then starting over under the central diagonal working its way to the left. For a fixed $n$ this could easily be done manually, but with my limitations in Mathematica I have not found a way to do this with arbitrary integers.

share|improve this question
Ponder on Join @@ Table[-Differences[Diagonal[G, k]], {k, {0, 1, -1}}]. – J. M. Jun 3 '13 at 17:10
@0x4A4D : Exactly what I was looking for. Thank you! – guest Jun 3 '13 at 17:21
up vote 2 down vote accepted
k = Table[g[i, j], {i, 4}, {j, 4}]; 
Flatten[Diagonal[k[[;; -2, ;; -2]] - k[[2 ;;, 2 ;;]], #] & /@ {0, 1, -1}]
share|improve this answer

Since it seems to suit the OP's needs:

G = Array[g, {4, 4}];
Join @@ Table[-Differences[Diagonal[G, k]], {k, {0, 1, -1}}]
   {g[1, 1] - g[2, 2], g[2, 2] - g[3, 3], g[3, 3] - g[4, 4], g[1, 2] - g[2, 3],
    g[2, 3] - g[3, 4], g[2, 1] - g[3, 2], g[3, 2] - g[4, 3]}

The key here is the use of Diagonal[] to extract the diagonals of a matrix (note the second argument for picking which diagonal to extract), and the use of Differences[] to generate the needed entries; however, the sign is opposite from what the OP needed, so we perform a negation afterwards. Join[] merely strings together the three diagonals thus extracted into a single list.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.