4c219d9040db8b52822f8312f9a115547fc1cdf1
[scilab.git] / scilab / modules / overloading / macros / %rp_k_generic.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2018 - Samuel GOUGEON
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 res = %rp_k_generic(a,b)
14     // a .*. b, with
15     // a: polynomial or rational
16     // b: number, polynomial, or rational
17
18     ia = matrix(1:size(a,"*"), size(a));
19     ib = matrix(1:size(b,"*"), size(b));
20
21     // Size of the result:
22     sa = size(a);
23     sb = size(b);
24     ndims_a = length(sa)
25     ndims_b = length(sb)
26     ndims_r = max(ndims_a, ndims_b);
27     sa = [sa ones(1,(ndims_r-ndims_a))];
28     sb = [sb ones(1,(ndims_r-ndims_b))];
29     sr = sa .* sb;
30
31     // PROCESSING
32     // ----------
33     if  typeof(a)~="rational" & typeof(b)~="rational"
34         res = a(ia .*. ones(b))(:) .* b(ones(a) .*. ib)(:);
35     else
36         // Special case of rationals ( "(i)" indexing fails)
37         //  => We apply kron() separately on the numerator and denominator
38         if typeof(a)=="rational"
39             anum = a.num
40             aden = a.den
41             dt = a.dt
42         else
43             anum = a
44             aden = ones(a)
45         end
46         if typeof(b)=="rational"
47             bnum = b.num
48             bden = b.den
49             dt = b.dt
50         else
51             bnum = b
52             bden = ones(b)
53         end
54         ria = (ia.*.ones(b));     // replicated indices in a
55         rib = (ones(a).*.ib);     // replicated indices in b
56         //
57         res = rlist(anum(ria)(:) .* bnum(rib)(:), aden(ria)(:) .* bden(rib)(:), dt);
58     end
59
60     // Final formatting
61     res = matrix(res, sr);
62 endfunction