Re: Extract any diagonal from a square matrix...
- To: mathgroup at smc.vnet.net
- Subject: [mg66289] Re: [mg66279] Extract any diagonal from a square matrix...
- From: "Carl K. Woll" <carlw at wolfram.com>
- Date: Mon, 8 May 2006 00:46:08 -0400 (EDT)
- References: <200605070350.XAA08508@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
hawkmoon269 wrote: > Trying to put a function together that extracts any one of the > diagonals from a square matrix. Right now I have this -- > > DiagonalT[a_List, d_Integer] := > Tr[Take[Which[Positive[d], a, Negative[d], Transpose[a]], > {1, Length[a] - Abs[d] + 1}, {Abs[d], Length[a]}], List] > > This works, but I thought there might be something less cumbersome. > Essentially, the function constructs a submatrix of the matrix so that > the requested diagonal from the matrix becomes the main diagonal of the > submatrix, which is then retrieved. D is the diagonal to retrieve, > where d = > > 3 -- 2nd superdiagonal > 2 -- 1st superdiagonal > 1 -- main diagonal > -2 -- 1st subdiagonal > -3 -- 2nd subdiagonal > > etc... > > Some other things I've considered -- > > ...rotating the elements of each row until column 1 becomes the > requested diagonal; > ...dropping elements from each row until the first or last element in > each row becomes the next element in the requested diagonal; > ...flattening the matrix and then using Range and Part to retrieve the > requested diagonal. > > Any thoughts...? > > h First, I would use 1 -- 1st superdiagonal 0 -- main diagonal -1 -- 1st subdiagonal etc. To find these diagonals, I would implement your idea as follows: diag[mat_,d_]:= Tr[PadLeft[m, Dimensions[m] + If[d > 0, {0, -d}, {d, 0}]],List] Carl Woll Wolfram Research
- References:
- Extract any diagonal from a square matrix...
- From: "hawkmoon269" <rson@new.rr.com>
- Extract any diagonal from a square matrix...