* Bug 15347 fixed: toeplitz failed with rationals
[scilab.git] / scilab / modules / elementary_functions / macros / toeplitz.sci
index 3baefbb..cf2cf98 100644 (file)
@@ -2,6 +2,7 @@
 // Copyright (C) INRIA
 // Copyright (C) DIGITEO - 2011 - Allan CORNET
 // Copyright (C) Scilab Enterprises - 2011 - Calixte DENIZET
+// Copyright (C) 2017 - Samuel GOUGEON
 //
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
 //
 // along with this program.
 
 function a = toeplitz(c, r)
-    //a=toeplitz(c,r)  returns the Toepliz matrix whose first row
-    //is r and first column is c .( r(1) = c(1) is assumed).
-    //
-    //r and  c can be constant, polynomial or character string matrices.
-    //!
+    // a = toeplitz(c,r)  returns the Toepliz matrix whose first row
+    // is r and first column is c .( r(1) = c(1) is assumed).
 
-    [lhs, rhs] = argn(0);
+    // Checking input arguments
+    // ------------------------
+    rhs = argn(2);
     if rhs < 1 then
-        error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"), "toeplitz", 1));
+        msg = _("%s: Wrong number of input argument(s): %d to %d expected.\n");
+        error(msprintf(msg, "toeplitz", 1, 2));
     end
-
     if rhs == 1 then
-        r = c(:);
+        r = c;
     end
-
-    nr = size(r, "*");
-    r = matrix(r, 1, nr);
-    nc = size(c, "*");
-    c = matrix(c, 1, nc);
-
-    if nr * nc == 0 then
-        a = [];
-        return;
+    
+    if isempty(c) | isempty(r) then
+        a = []
+        return
     end
-
-    if r(1) <> c(1) then
-        error(msprintf(gettext("%s: Wrong values for input arguments #%d and #%d: c(1) must be equal to r(1).\n"), "toeplitz", 1, 2));
+    // Checking types compatibility & upper left common corner:
+    r = matrix(r, 1, -1);
+    c = matrix(c, 1, -1);
+    tmp = [c(1,1) r(1,1)];
+    if tmp(1,1) <> tmp(1,2) then
+        msg = _("%s: Wrong values for input arguments #%d and #%d: c(1) must be equal to r(1).\n");
+        error(msprintf(msg, "toeplitz", 1, 2));
     end
 
+    // Processing
+    // ----------
+    nr = size(r, "*");
+    nc = size(c, "*");
     index = ones(1, nr) .*. ((nc - 1):-1:0)' + (1:nr) .*. ones(nc, 1);
-    b = [c($:-1:2) r];
-    a = matrix(b(index), nc, nr);
+    b = [c(1, $:-1:2) r];
+    a = matrix(b(1,index(:)'), nc, nr);
 endfunction