Re: Extract any diagonal from a square matrix...
- To: mathgroup at smc.vnet.net
- Subject: [mg66285] Re: [mg66279] Extract any diagonal from a square matrix...
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Mon, 8 May 2006 00:45:59 -0400 (EDT)
- References: <200605070350.XAA08508@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
On 7 May 2006, at 12:50, 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 > Here is another approach, quite different form everything you mention above, and I think quite elegant, but unfortunately not very efficient. (I have not tested it but in general algebraic approaches of this kind, tend to be fairly inefficient). I will use somewhat different notation form yours, with d=0 corresponding to the main diagonal, which this seems more natural to me. One can make it all work the way you want of course. DiagonalT[a_?MatrixQ, d_Integer] := Array[If[#2 - #1 == d, 1, 0] &, Dimensions[a]]*a e.g. m = Array[a, {4, 4}] {{a[1, 1], a[1, 2], a[1, 3], a[1, 4]}, {a[2, 1], a[2, 2], a[2, 3], a[2, 4]}, {a[3, 1], a[3, 2], a[3, 3], a[3, 4]}, {a[4, 1], a[4, 2], a[4, 3], a[4, 4]}} DiagonalT[m, 1] {{0, a[1, 2], 0, 0}, {0, 0, a[2, 3], 0}, {0, 0, 0, a[3, 4]}, {0, 0, 0, 0}} Andrzej Kozlowski Tokyo, Japan
- References:
- Extract any diagonal from a square matrix...
- From: "hawkmoon269" <rson@new.rr.com>
- Extract any diagonal from a square matrix...