elementary_functions module.
[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