On 5/6/06 at 11:50 PM, rson at new.rr.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
Another possible approach would be to use SparseArray. For example, the 1st superdiagonal can be obtained as follows:
In[21]:=
a=Table[10i +j,{i,4},{j,4}];
b=SparseArray[{i_,j_}:>1/;j==i+1,{4,4}];
SparseArray[a b]/.SparseArray[_,_,_,a_]:>Last@a
Out[23]=
{12,23,34}
This can be generalized to extract an arbitrary diagonal by changing b to be
b=SparseArray[{i_,j_}:>1/;j==i+d] where d=
2 -- 2nd superdiagonal
1 -- 1st superdiagonal
0 -- main diagonal
-1 -- 1st subdiagonal
-2 -- 2nd subdiagonal
--
To reply via email subtract one hundred and four