de2c5666fbc65060ed7abf77b4b738576ca2083b
[scilab.git] / scilab / modules / elementary_functions / macros / %sp_diag.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 //
4 // This file must be used under the terms of the CeCILL.
5 // This source file is licensed as described in the file COPYING, which
6 // you should have received as part of this distribution.  The terms
7 // are also available at
8 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
9
10 function d=%sp_diag(a,k)
11     // %sp_diag - implement diag function for sparse matrix, rational matrix ,..
12
13     [lhs,rhs]=argn(0)
14     if rhs==1 then k=0,end
15
16     [ij,v,sz]=spget(a)
17     m=sz(1);n=sz(2)
18     if m>1&n>1 then
19         l=find(ij(:,1)==(ij(:,2)-k))
20         if k<=0 then
21             mn=min(m+k,n)
22             i0=-k
23         else
24             mn=min(m,n-k)
25             i0=0
26         end
27         kk=abs(k)
28         if l==[] then d=sparse([],[],[mn,1]);return;end
29         d=sparse([ij(l,1)-i0,ones(ij(l,1))],v(l),[mn,1])
30     else
31         if m>1 then ij=ij(:,1);else ij=ij(:,2);end
32         nn = max(m,n)+abs(k)
33         if ij==[] then
34             d=sparse([],[],[nn,nn])
35         else
36             if k>0 then
37                 d=sparse([ij,ij+k],v,[nn,nn])
38             else
39                 d=sparse([ij-k,ij],v,[nn,nn])
40             end
41         end
42     end
43 endfunction