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...