8de12e9ec2868c8034b7a98b04301a751c32ec18
[scilab.git] / scilab / modules / overloading / macros / %p_j_s.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 function f=%p_j_s(p,s)
14     // %p_j_s(p,s)  computes p.^s for p polynomial matrix in special cases
15     //!
16
17     if s==[] then f=[],return,end
18     if  or(imag(s)<>0)|or(int(s)<>s) then error(msprintf(_("%s: Wrong type for input argument #%d: An integer matrix expected.\n"),"%p_j_s",2)),end
19     [m,n]=size(p)
20     [ms,ns]=size(s)
21     if ms==1&ns==1 then
22         if s<0 then
23             if or(abs(coeff(p(:)))*ones(max(degree(p))+1,1)==0) then
24                 error(27)
25             end
26             f=rlist(ones(p),p.^(-s),[])
27         else // this case is in fact hard coded
28             f=p.^s
29         end
30     elseif m==1&n==1 then // Element wise exponentiation p.^s with p "scalar"
31         kp=find(s>=0)
32         kn=find(s<0)
33         num=ones(s)
34         den=ones(s)
35         num(kp)=p.^s(kp)
36         p=1/p
37         num(kn)=p(2).^(-s(kn))
38         den(kn)=p(3).^(-s(kn))
39         f=rlist(num,den,[])
40     elseif ms==m&ns==n then  // Element wise exponentiation
41         p=p(:);s=s(:);
42         kp=find(s>=0)
43         kn=find(s<0)
44         num=p
45         den=ones(s)
46         num(kp)=num(kp).^s(kp)
47         if or(abs(coeff(p(kn)))*ones(max(degree(p(kn)))+1,1)==0) then
48             error(27)
49         end
50         num(kn)=ones(p(kn))
51         den(kn)=p(kn).^(-s(kn))
52         f = rlist(matrix(num,n,m),matrix(den,n,m),[])
53     else
54         error(30)
55     end
56
57 endfunction