Re: Extract any diagonal from a square matrix...
- To: mathgroup at smc.vnet.net
- Subject: [mg66294] Re: [mg66279] Extract any diagonal from a square matrix...
- From: Bob Hanlon <hanlonr at cox.net>
- Date: Mon, 8 May 2006 00:46:22 -0400 (EDT)
- Reply-to: hanlonr at cox.net
- Sender: owner-wri-mathgroup at wolfram.com
Change the definition of d to be symmetric: 2 -- 2nd superdiagonal 1 -- 1st superdiagonal 0 -- main diagonal -1 -- 1st subdiagonal -2 -- 2nd subdiagonal DiagonalT[a_List, d_Integer] := Module[{r=If[d>0,0,-d], c=If[d>0,d,0]}, Table[a[[k+r,k+c]], {k,1,Length[a]-Abs[d]}]]/; Abs[d]<Length[a]; Bob Hanlon ---- hawkmoon269 <rson at new.rr.com> 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 >