* Bug #12045 fixed - repmat returned wrong result if numbers of input matrix were... 90/10490/10
Charlotte HECQUET [Fri, 15 Feb 2013 12:36:59 +0000 (13:36 +0100)]
Change-Id: I308e87a4a609aac74ca49e8fe1fbc9682914dd40

scilab/CHANGES_5.4.X
scilab/CHANGES_5.5.X
scilab/modules/elementary_functions/macros/repmat.sci
scilab/modules/elementary_functions/tests/nonreg_tests/bug_12045.dia.ref [new file with mode: 0644]
scilab/modules/elementary_functions/tests/nonreg_tests/bug_12045.tst [new file with mode: 0644]
scilab/modules/elementary_functions/tests/unit_tests/repmat.dia.ref
scilab/modules/elementary_functions/tests/unit_tests/repmat.tst

index 729162b..07b7bad 100644 (file)
@@ -378,7 +378,7 @@ Scilab
 
 * Bug #12043 fixed - Typo in the atomsShow help page fixed.
 
-* Bug #12050 fixed - Typo dimensionnal => dimensional fixed.
+* Bug #12050 fixed - Fix a typo: dimensionnal => dimensional.
 
 * Bug #12059 fixed - Indices returned by gsort were wrong for sparse matrices.
 
index db3abe9..4284aa7 100644 (file)
@@ -150,6 +150,8 @@ Bug fixes
 
 * Bug #11891 fixed - Fisher ratio could be inaccurate for one-way ANOVA.
 
+* Bug #12045 fixed - repmat returned wrong result if numbers of input matrix were not double.
+
 * Bug #12163 fixed - unzoom did not work with a single input argument.
 
 * Bug #12415 fixed - PATH environment variable grew when using call_scilab in a loop.
index 7c686e9..50fb250 100644 (file)
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
 function B = repmat(A,varargin)
-//ajouter test sur les type des elements de varargin
-  rhs = argn(2);
-  if rhs < 2 then
-    error(msprintf(_("%s: Wrong number of input arguments: at least %d expected.\n"), "repmat", 2))
-  end
+    //ajouter test sur les type des elements de varargin
+    rhs = argn(2);
+    if rhs < 2 then
+        error(msprintf(_("%s: Wrong number of input arguments: at least %d expected.\n"), "repmat", 2))
+    end
 
-  narg=size(varargin);
+    narg=size(varargin);
 
-  // Test varargin
-  if narg==1 then
-    // Scalar of vector needed
-    if typeof(varargin(1)) <> "constant" then
-      error(msprintf(_("%s: Wrong type for input argument #%d: A real scalar or vector expected.\n"), "repmat", 2))
-    end
-    if size(varargin(1),'*')<>1 & isempty(find(size(varargin(1))==1)) then
-      error(msprintf(_("%s: Wrong size for input argument #%d: A real scalar or vector expected.\n"), "repmat", 2))
-    end
-  else
-    for i=1:narg
-      if typeof(varargin(i)) <> "constant" then
-        error(msprintf(_("%s: Wrong type for input argument #%d: A real scalar expected.\n"), "repmat", i+1))
-      end
-      if size(varargin(i),"*")<>1 then
-        error(msprintf(_("%s: Wrong size for input argument #%d: A real scalar expected.\n"), "repmat", i+1))
-      end
+    // Test varargin
+    if narg==1 then
+        // Scalar of vector needed
+        if typeof(varargin(1)) <> "constant" then
+            error(msprintf(_("%s: Wrong type for input argument #%d: A real scalar or vector expected.\n"), "repmat", 2))
+        end
+        if size(varargin(1),'*')<>1 & isempty(find(size(varargin(1))==1)) then
+            error(msprintf(_("%s: Wrong size for input argument #%d: A real scalar or vector expected.\n"), "repmat", 2))
+        end
+    else
+        for i=1:narg
+            if typeof(varargin(i)) <> "constant" then
+                error(msprintf(_("%s: Wrong type for input argument #%d: A real scalar expected.\n"), "repmat", i+1))
+            end
+            if size(varargin(i),"*")<>1 then
+                error(msprintf(_("%s: Wrong size for input argument #%d: A real scalar expected.\n"), "repmat", i+1))
+            end
+        end
     end
-  end
 
-  if type(A)>10 then
-    if typeof(A)=="rational" then
-      B=rlist(repmat(A.num,varargin(:)),repmat(A.den,varargin(:)),A.dt)
-      return
-    elseif typeof(A)<>"hypermat" then
-      execstr('B=%'+typeof(A)+"_repmat(A,varargin(:))")
-      return
+    if type(A)>10 then
+        if typeof(A)=="rational" then
+            B=rlist(repmat(A.num,varargin(:)),repmat(A.den,varargin(:)),A.dt)
+            return
+        elseif typeof(A)<>"hypermat" then
+            execstr('B=%'+typeof(A)+"_repmat(A,varargin(:))")
+            return
+        end
     end
-  end
 
-  if narg==1 then
-    if size(varargin(1),'*')==1 then
-      siz=list(varargin(1),varargin(1))
-    else //convert array into list
-      tmp=varargin(1)
-      siz=list();
-      for i=1:size(tmp,'*'),siz(i)=tmp(i); end
+    if narg==1 then
+        if size(varargin(1),'*')==1 then
+            siz=list(varargin(1),varargin(1))
+        else //convert array into list
+            tmp=varargin(1)
+            siz=list();
+            for i=1:size(tmp,'*'),siz(i)=tmp(i); end
+        end
+    else
+        siz=list();
+        for i=1:narg
+            siz(i)=varargin(i)
+        end
     end
-  else
-    siz=list();
-    for i=1:narg
-      siz(i)=varargin(i)
+
+    nd=size(siz)
+    if or(type(A)==[5 6]) then //sparse matrices
+        if nd>2 then
+            error(msprintf(_("%s: Wrong number of output matrix dimensions required: %d expected for sparse matrices.\n"), "repmat", 2))
+        end
     end
-  end
 
-  nd=size(siz)
-  if or(type(A)==[5 6]) then //sparse matrices
-    if nd>2 then
-      error(msprintf(_("%s: Wrong number of output matrix dimensions required: %d expected for sparse matrices.\n"), "repmat", 2))
+    for i=size(siz):-1:3
+        if siz(i)>1 then break,end
+        nd=nd-1
     end
-  end
+    sizA=size(A)
+    nda=size(sizA,'*')
 
-  for i=size(siz):-1:3
-    if siz(i)>1 then break,end
-    nd=nd-1
-  end
-  sizA=size(A)
-  nda=size(sizA,'*')
-  if and(sizA==1) then //scalar case
+    if and(sizA==1) then //scalar case
 
-    //this case can also be handled by the general one but in a less
-    //efficient way
-    if nd<=2 then
-      B=A(ones(siz(1:nd)))
-    else
-      s=1;for k=1:nd;s=s*siz(k),end
-      B=matrix(A(ones(s,1)),siz(1:nd))
-    end
-  else //general case
-    if nda<nd then
-      sizA(nda+1:nd)=1;
-    elseif  nda>nd then
-      for k=nd+1:nda
-        siz(k)=1
-      end
-      nd=nda
-    end
-    I=list();
-    for i=1:nd
-      ind=matrix(1:sizA(i),-1,1);
-      ind=ind(:,ones(1,siz(i)));
-      I(i)=ind;
+        //this case can also be handled by the general one but in a less
+        //efficient way
+        if nd<=2 then
+            B=A(ones(siz(1:nd)))
+        else
+            s=1;for k=1:nd;s=s*siz(k),end
+            B=matrix(A(ones(s,1)),siz(1:nd))
+        end
+    else //general case
+        if nda<nd then
+            sizA(nda+1:nd)=1;
+        elseif  nda>nd then
+            for k=nd+1:nda
+                siz(k)=1
+            end
+            nd=nda
+        end
+        I=list();
+        for i=1:nd
+            ind=matrix(1:sizA(i),-1,1);
+            ind=ind(:,ones(1,siz(i)));
+            I(i)=ind;
+        end
+
+        if typeof(A) == 'hypermat' | (size(varargin(1),"*") <> 1 & size(varargin(1)) <3) then // Works if A is hypermat but not for int8,int16 matrix
+            B=A(I(:));
+        else // Works for int8, int16... matrix but not for hypermat
+            if rhs ==2 then
+                if size(varargin(1),"*") <> 1 then // case repmat(A,size)
+                    varargin_temp=varargin;
+                    if size(varargin(1),1) <> 1 & size(varargin(1),2) == 1 then
+                        for i=1:size(varargin(1),1)
+                            varargin(i)=varargin_temp(1)(i);
+                        end
+                    elseif size(varargin(1),2) <> 1 & size(varargin(1),1) == 1 then
+                        for i=1:size(varargin(1),2)
+                            varargin(i)=varargin_temp(1)(i);
+                        end
+                    else 
+                        error(msprintf(_("%s: Wrong size for input argument #%d: a vector expected.\n"),"repmat",2));
+                    end
+                end
+            end
+            res=A(I(1),I(2));
+            A_base=matrix(res,size(res,1)*size(res,2),1);
+            dims=[size(A,1)*varargin(1)];
+            for i=2:size(varargin) //compute dims
+                dims_1=[size(A,i)*varargin(i)];
+                dims=[dims, dims_1];
+            end
+            nb=1;
+            flag=0;
+            for i=3:size(varargin)
+                nb=nb*varargin(i);
+                if varargin(i)~=1 then // dims[2 2 1 1]=>dims[2 2]
+                    flag=1;
+                end
+            end
+            if size(varargin) ==1 then // dims[2] => dims[2 2]
+                varargin(2) = varargin(1);
+            end
+            if flag == 0 then
+                B=matrix(A_base,varargin(1)*size(A,1), varargin(2)*size(A,2));
+            else
+                J1=[1:size(A_base,1)];
+                J=J1;
+                for k=1:nb-1
+                    J=[J,J1];
+                end
+                J=J';
+                A_final=A_base(J);
+                B=mlist(["hm", "dims", "entries"], matrix(dims,1,-1), matrix(A_final,-1,1));
+            end
+        end
     end
-    B=A(I(:))
-  end
 endfunction
+
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_12045.dia.ref b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_12045.dia.ref
new file mode 100644 (file)
index 0000000..e0a4cc5
--- /dev/null
@@ -0,0 +1,30 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 12045 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12045
+//
+// <-- Short Description -->
+// repmat function returns wrong result if numbers of input matrix are not double
+//
+A= [1 7 31 127; 3 15 63 55];
+A_int8=int8(A);
+A_uint8=uint8(A);
+A_int16=int16(A);
+A_uint16=uint16(A);
+A_int32=int32(A);
+A_uint32=uint32(A);
+assert_checkequal(repmat(A_int8,1,1,2),repmat(A,1,1,2));
+assert_checkequal(repmat(A_uint8,1,1,2),repmat(A,1,1,2));
+assert_checkequal(repmat(A_int16,1,1,2),repmat(A,1,1,2));
+assert_checkequal(repmat(A_uint16,1,1,2),repmat(A,1,1,2));
+assert_checkequal(repmat(A_int32,1,1,2),repmat(A,1,1,2));
+assert_checkequal(repmat(A_uint32,1,1,2),repmat(A,1,1,2));
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_12045.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_12045.tst
new file mode 100644 (file)
index 0000000..8fd154a
--- /dev/null
@@ -0,0 +1,32 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Charlotte HECQUET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 12045 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12045
+//
+// <-- Short Description -->
+// repmat function returns wrong result if numbers of input matrix are not double
+//
+
+A= [1 7 31 127; 3 15 63 55];
+A_int8=int8(A);
+A_uint8=uint8(A);
+A_int16=int16(A);
+A_uint16=uint16(A);
+A_int32=int32(A);
+A_uint32=uint32(A);
+
+assert_checkequal(repmat(A_int8,1,1,2),repmat(A,1,1,2));
+assert_checkequal(repmat(A_uint8,1,1,2),repmat(A,1,1,2));
+assert_checkequal(repmat(A_int16,1,1,2),repmat(A,1,1,2));
+assert_checkequal(repmat(A_uint16,1,1,2),repmat(A,1,1,2));
+assert_checkequal(repmat(A_int32,1,1,2),repmat(A,1,1,2));
+assert_checkequal(repmat(A_uint32,1,1,2),repmat(A,1,1,2));
index f7354d0..e2ec32b 100644 (file)
@@ -5,16 +5,26 @@
 //  This file is distributed under the same license as the Scilab package.
 // =============================================================================
 // <-- CLI SHELL MODE -->
-if or(repmat(1:3,2,2)<>[1,2,3,1,2,3;1,2,3,1,2,3]) then bugmes();quit;end
-if or(repmat(1+2*%i,2)<>[ 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2]) then bugmes();quit;end
+assert_checkequal(repmat(1:3,2,2),[1,2,3,1,2,3;1,2,3,1,2,3]);
+assert_checkequal(repmat(1+2*%i,2),[ 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2]);
 a=int8([1 0 1;0 1 0]);
-if or(repmat(a,2,3,2)<>matrix(int32([1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;
-                    0;1;1;0;1;0;1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;0;1;
-                    1;0;1;0;1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;0;1;1;0;
-                    1;0]),4,9,2)) then bugmes();quit;end
-if or(repmat("Scilab",3,2)<>["Scilab","Scilab";"Scilab","Scilab";
-                    "Scilab","Scilab"]) then bugmes();quit;end
+assert_checkequal(repmat(a,2,3,2),matrix(int32([1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1; ...
+0;1;1;0;1;0;1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;0;1; ...
+1;0;1;0;1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;0;1;1;0; ...
+1;0]),4,9,2));
+assert_checkequal(repmat("Scilab",3,2),["Scilab","Scilab";"Scilab","Scilab";"Scilab","Scilab"]);
 H=repmat([1/%s;2/(%s+1)],1,3);
-if or(H.num<>[1,1,1;2,2,2]) then bugmes();quit;end
-if or(H.den<>[%s,%s,%s;1+%s,1+%s,1+%s]) then bugmes();quit;end
-if repmat([],2,2)<>[] then bugmes();quit;end
+s=poly(0,'s');
+H_ref=[1/s,1/s,1/s;2/(1+s),2/(1+s),2/(1+s)];
+assert_checkequal(numer(H),numer(H_ref));
+assert_checkequal(denom(H),denom(H_ref));
+assert_checkequal(repmat([],2,2),[]);
+B_ref=hypermat([2 4 2],[1;3;7;15;31;63;127;55;1;3;7;15;31;63;127;55]);
+assert_checkequal(repmat(int8([1,7,31,127;3,15,63,55]),1,1,2),B_ref);
+C_ref = hypermat([2 3 2 2], 1:24);
+assert_checkequal(repmat(C_ref,1),C_ref);
+assert_checkequal(repmat(1:2, 2),[1 2 1 2; 1 2 1 2]);
+assert_checkequal(repmat(hypermat(2,1:2),2),[1 2 1 2; 1 2 1 2]);
+assert_checkequal(repmat([1,2;3,4],[2,3]),[1,2,1,2,1,2;3,4,3,4,3,4;1,2,1,2,1,2;3,4,3,4,3,4]);
+assert_checkequal(repmat(int8([1,2;3,4]),[2,3]),int8([1,2,1,2,1,2;3,4,3,4,3,4;1,2,1,2,1,2;3,4,3,4,3,4]));
+assert_checkequal(repmat(hypermat(2,1:2),[2,3]),[1,2,1,2,1,2;1,2,1,2,1,2]);
index 17cb36c..8b1fb69 100644 (file)
@@ -7,22 +7,26 @@
 
 // <-- CLI SHELL MODE -->
 
-if or(repmat(1:3,2,2)<>[1,2,3,1,2,3;1,2,3,1,2,3]) then pause,end
-if or(repmat(1+2*%i,2)<>[ 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2]) then pause,end
-
-
+assert_checkequal(repmat(1:3,2,2),[1,2,3,1,2,3;1,2,3,1,2,3]);
+assert_checkequal(repmat(1+2*%i,2),[ 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2]);
 a=int8([1 0 1;0 1 0]);
-if or(repmat(a,2,3,2)<>matrix(int32([1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;
-                    0;1;1;0;1;0;1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;0;1;
-                    1;0;1;0;1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;0;1;1;0;
-                    1;0]),4,9,2)) then pause,end
-
-
-if or(repmat("Scilab",3,2)<>["Scilab","Scilab";"Scilab","Scilab";
-                    "Scilab","Scilab"]) then pause,end
-
+assert_checkequal(repmat(a,2,3,2),matrix(int32([1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1; ...
+0;1;1;0;1;0;1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;0;1; ...
+1;0;1;0;1;0;1;0;0;1;0;1;1;0;1;0;1;0;1;0;0;1;0;1;1;0; ...
+1;0]),4,9,2));
+assert_checkequal(repmat("Scilab",3,2),["Scilab","Scilab";"Scilab","Scilab";"Scilab","Scilab"]);
 H=repmat([1/%s;2/(%s+1)],1,3);
-if or(H.num<>[1,1,1;2,2,2]) then pause,end
-if or(H.den<>[%s,%s,%s;1+%s,1+%s,1+%s]) then pause,end
-if repmat([],2,2)<>[] then pause,end
-
+s=poly(0,'s');
+H_ref=[1/s,1/s,1/s;2/(1+s),2/(1+s),2/(1+s)];
+assert_checkequal(numer(H),numer(H_ref));
+assert_checkequal(denom(H),denom(H_ref));
+assert_checkequal(repmat([],2,2),[]);
+B_ref=hypermat([2 4 2],[1;3;7;15;31;63;127;55;1;3;7;15;31;63;127;55]);
+assert_checkequal(repmat(int8([1,7,31,127;3,15,63,55]),1,1,2),B_ref);
+C_ref = hypermat([2 3 2 2], 1:24);
+assert_checkequal(repmat(C_ref,1),C_ref);
+assert_checkequal(repmat(1:2, 2),[1 2 1 2; 1 2 1 2]);
+assert_checkequal(repmat(hypermat(2,1:2),2),[1 2 1 2; 1 2 1 2]);
+assert_checkequal(repmat([1,2;3,4],[2,3]),[1,2,1,2,1,2;3,4,3,4,3,4;1,2,1,2,1,2;3,4,3,4,3,4]);
+assert_checkequal(repmat(int8([1,2;3,4]),[2,3]),int8([1,2,1,2,1,2;3,4,3,4,3,4;1,2,1,2,1,2;3,4,3,4,3,4]));
+assert_checkequal(repmat(hypermat(2,1:2),[2,3]),[1,2,1,2,1,2;1,2,1,2,1,2]);