bug 11079 fixed: tlist(['r','num','den','dt'] replaced by rlist
[scilab.git] / scilab / modules / overloading / macros / %p_p_s.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 f=%p_p_s(p,s)
11 // %p_p_s(p,s)  computes p^s for p polynomial matrix in special cases
12 //!
13
14 if s==[] then f=[],return,end
15 if  or(imag(s)<>0)|or(int(s)<>s) then error('%p_p_s: integer power only'),end
16 [m,n]=size(p)
17 [ms,ns]=size(s)
18 if ms==1&ns==1 then
19   if m==1|n==1 then //Element wise exponentiation p.^s with p vector
20     if s<0 then 
21       if or(abs(coeff(p(:)))*ones(max(degree(p))+1,1)==0) then
22         error(27)
23       end
24       f = rlist(ones(p),p.^(-s),[])
25     else // this case is in fact hard coded
26       f=p.^s
27     end
28   elseif m==n then //square matrix exponentiation p^s
29     if s<0 then 
30       f=invr(p),
31       s=-s;
32       f1=f;for k=2:s,f=f*f1;end
33     else
34       f=p
35       for k=2:s,f=f*p;end
36     end
37   else
38     error(20,1)
39   end
40 elseif ms==1|ns==1 then // Element wise exponentiation f.^s with f "scalar"
41   if m<>1|n<>1 then error(43),end
42    
43   kp=find(s>=0)
44   kn=find(s<0)
45   num=ones(s)
46   den=ones(s)
47   num(kp)=p.^s(kp)
48   if abs(coeff(p))*ones(degree(p)+1,1)==0 then
49     error(27)
50   end
51   den(kn)=p.^(-s(kn))
52   f = rlist(num,den,[])
53 else
54   error(43)
55 end
56
57   
58 endfunction