* Bug #13409 fixed - permute(x, dims) failed when dims was greater than the dimension... 28/14528/6
Samuel Gougeon [Wed, 14 May 2014 10:50:21 +0000 (12:50 +0200)]
now permute treats extra dimensions as 1

Change-Id: I22e5bbb511fdb90e840fafcc8afc4e60158f4b5b

scilab/CHANGES_5.5.X
scilab/modules/elementary_functions/help/en_US/matrixmanipulation/permute.xml
scilab/modules/elementary_functions/macros/permute.sci
scilab/modules/elementary_functions/tests/nonreg_tests/bug_13409.dia.ref [new file with mode: 0644]
scilab/modules/elementary_functions/tests/nonreg_tests/bug_13409.tst [new file with mode: 0644]
scilab/modules/elementary_functions/tests/unit_tests/permute.dia.ref
scilab/modules/elementary_functions/tests/unit_tests/permute.tst

index b860ab6..4d96d75 100644 (file)
@@ -37,6 +37,9 @@ Scilab Bug Fixes
 
 * Bug #13401 fixed - Closing Scilab during halt() did not quit the Scilab process.
 
+* Bug #13409 fixed - permute(x, dims) failed when dims was greater than the dimensions of size(x)
+                     now permute treats extra dimensions as 1
+
 
 Xcos Bug Fixes
 ==============
index 1ab7a8b..ae8dfd2 100644 (file)
@@ -2,11 +2,11 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA - Farid BELAHCENE
- * 
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
- * are also available at    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
  *
  -->
     <refsection>
         <title>Description</title>
         <para>
-            <literal>Permute the dimensions of an array.</literal>
+            Permutes the dimensions of an array according to <varname>dims</varname>.
+        </para>
+        <para>
+            Input argument <varname>dims</varname> must be a valid permutation where dimension <literal>#i</literal> becomes <literal>#dims(i)</literal>.
         </para>
     </refsection>
     <refsection>
         <title>Examples</title>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 //example 1:
-x=[1 2 3;4 5 6];
-y=permute(x,[2 1]);
+x=[1 2 3;4 5 6]
+y=permute(x,[2 1])
 
 //example 2:
-x=matrix(1:12,[2,3,2]);
-y=permute(x,[3 1 2]);
+x=matrix(1:12,[2,3,2])
+y=permute(x,[3 1 2])
+
+x = matrix(1:12, [3 2 2])
+y = permute(x, [3 4 1 2])
+// Dimensions are changed according to dims
+// #1=rows    becomes #3=pages
+// #2=columns becomes #4=books
+// #3=pages   becomes #1=rows
+// #4=books   becomes #2=columns
  ]]></programlisting>
     </refsection>
     <refsection role="see also">
index 98be866..b23ec93 100644 (file)
@@ -27,7 +27,7 @@ function y = permute(x, dims)
         error(msprintf(gettext("%s: Wrong size for argument #%d: Vector expected.\n"), "permute", 2));
 
     elseif or(gsort(dims,"c","i") <> (1:prod(size(dims)))) then
-        error(msprintf(gettext("%s: Wrong size for input argument #%d.\n"), "permute", 2));
+        error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be a valid permutation vector.\n"), "permute", 2));
 
     elseif prod(size(dims)) < ndims(x) then
         error(msprintf(gettext("%s: Wrong size for input argument #%d: At least the size of input argument #%d expected.\n"), "permute", 2, 1));
@@ -43,6 +43,10 @@ function y = permute(x, dims)
     // Existing indices
     s = size(x)
     p = size(x, "*")
+
+    // Treat extra dimensions for permutations as 1
+    s = [s ones(1, length(dims) - length(s))];
+
     n = 1
     for i = 1:length(s)
         t = "x%d = ones(1,p/(prod(s(1:%d)))) .*. ((1:s(%d)) .*. ones(1,n)) ;"+..
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_13409.dia.ref b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_13409.dia.ref
new file mode 100644 (file)
index 0000000..89b2715
--- /dev/null
@@ -0,0 +1,62 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug  -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13409
+//
+// <-- Short Description -->
+// permute(x, dims) failed when dims was greater than the dimensions of size(x)
+// now permute treats extra dimensions as 1
+//
+// <-- CLI SHELL MODE -->
+x = matrix(1:6, [2, 3]);
+// x is of size 2, 2 so has 2 dimension
+res = permute(x, [3 2 1]); // this permutes x across the 3rd dimension
+// #Explanation
+// Dimensions are changed according to dims
+// * Number of lines becomes number of pages = 2
+// * Number of columns is unchanged = 3
+// * Number of pages becomes number of lines = 1
+ref = [1 3 5];
+ref(:,:,2) = [2 4 6];
+assert_checkequal(res, ref);
+// Check for extra dimensions
+x = matrix(1:12, [3 2 2]);
+res = permute(x, [2 3 1 4]);
+// Dimensions are changed according to dims
+// * Number of lines becomes number of columns = 2
+// * Number of columns becomes number of pages = 2
+// * Number of pages1 becomes number of lines = 3
+// * Number of pages2 becomes number of pages2 = 1
+// Extra dimension is squeezed
+ref = permute(x, [2 3 1]);
+assert_checkequal(res, ref);
+x = matrix(1:12, [3 2 2]);
+res = permute(x, [3 4 1 2]);
+// Dimensions are changed according to dims
+// * Number of lines becomes number of pages1 = 2
+// * Number of columns becomes number of pages2 = 1
+// * Number of pages1 becomes number of lines = 3
+// * Number of pages2 becomes number of columns = 2
+ref = [1 7]';
+ref(:,:,2,1) = [2 8]';
+ref(:,:,3,1) = [3 9]';
+ref(:,:,1,2) = [4 10]';
+ref(:,:,2,2) = [5 11]';
+ref(:,:,3,2) = [6 12]';
+assert_checkequal(res, ref);
+x = matrix(1:12, [3 2 2]);
+res = permute(x, 1:10);
+// Extra dimensions are squeezed
+assert_checkequal(x, res);
+// Bug #13409 test case
+dims=3; A1=matrix(1:12, [2,2,3]); A2=[13 14;15 16]; A3=matrix(21:36,[2,2,4]); y=cat(dims,A1,A2,A3);
+assert_checkequal(A1, y(:,:,1:3));
+assert_checkequal(A2, y(:,:,4));
+assert_checkequal(A3, y(:,:,5:8));
diff --git a/scilab/modules/elementary_functions/tests/nonreg_tests/bug_13409.tst b/scilab/modules/elementary_functions/tests/nonreg_tests/bug_13409.tst
new file mode 100644 (file)
index 0000000..67598ce
--- /dev/null
@@ -0,0 +1,69 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Pierre-Aime Agnel
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- Non-regression test for bug  -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13409
+//
+// <-- Short Description -->
+// permute(x, dims) failed when dims was greater than the dimensions of size(x)
+// now permute treats extra dimensions as 1
+//
+// <-- CLI SHELL MODE -->
+
+x = matrix(1:6, [2, 3]);
+// x is of size 2, 2 so has 2 dimension
+
+res = permute(x, [3 2 1]); // this permutes x across the 3rd dimension
+// #Explanation
+// Dimensions are changed according to dims
+// * Number of lines becomes number of pages = 2
+// * Number of columns is unchanged = 3
+// * Number of pages becomes number of lines = 1
+ref = [1 3 5];
+ref(:,:,2) = [2 4 6];
+
+assert_checkequal(res, ref);
+
+// Check for extra dimensions
+x = matrix(1:12, [3 2 2]);
+res = permute(x, [2 3 1 4]);
+// Dimensions are changed according to dims
+// * Number of lines becomes number of columns = 2
+// * Number of columns becomes number of pages = 2
+// * Number of pages1 becomes number of lines = 3
+// * Number of pages2 becomes number of pages2 = 1
+// Extra dimension is squeezed
+ref = permute(x, [2 3 1]);
+assert_checkequal(res, ref);
+
+x = matrix(1:12, [3 2 2]);
+res = permute(x, [3 4 1 2]);
+// Dimensions are changed according to dims
+// * Number of lines becomes number of pages1 = 2
+// * Number of columns becomes number of pages2 = 1
+// * Number of pages1 becomes number of lines = 3
+// * Number of pages2 becomes number of columns = 2
+ref = [1 7]';
+ref(:,:,2,1) = [2 8]';
+ref(:,:,3,1) = [3 9]';
+ref(:,:,1,2) = [4 10]';
+ref(:,:,2,2) = [5 11]';
+ref(:,:,3,2) = [6 12]';
+assert_checkequal(res, ref);
+
+x = matrix(1:12, [3 2 2]);
+res = permute(x, 1:10);
+// Extra dimensions are squeezed
+assert_checkequal(x, res);
+
+// Bug #13409 test case
+dims=3; A1=matrix(1:12, [2,2,3]); A2=[13 14;15 16]; A3=matrix(21:36,[2,2,4]); y=cat(dims,A1,A2,A3);
+assert_checkequal(A1, y(:,:,1:3));
+assert_checkequal(A2, y(:,:,4));
+assert_checkequal(A3, y(:,:,5:8));
index 75158b1..0ffceb8 100644 (file)
@@ -53,6 +53,6 @@ assert_checkequal(y, refY);
 // Error checks
 refMsg = msprintf(_("%s: Wrong size for input argument #%d: At least the size of input argument #%d expected.\n"), "permute", 2, 1);
 assert_checkerror("permute(x, [1 2]);", refMsg);
-refMsg = msprintf(_("%s: Wrong size for input argument #%d.\n"), "permute", 2);
+refMsg = msprintf(_("%s: Wrong value for input argument #%d: Must be a valid permutation vector.\n"), "permute", 2);
 assert_checkerror("permute(x, [1 2 4]);", refMsg);
 assert_checkerror("permute(x, [1 2 3 5]);", refMsg);
index 1dc48c9..67043dd 100644 (file)
@@ -70,6 +70,6 @@ assert_checkequal(y, refY);
 // Error checks
 refMsg = msprintf(_("%s: Wrong size for input argument #%d: At least the size of input argument #%d expected.\n"), "permute", 2, 1);
 assert_checkerror("permute(x, [1 2]);", refMsg);
-refMsg = msprintf(_("%s: Wrong size for input argument #%d.\n"), "permute", 2);
+refMsg = msprintf(_("%s: Wrong value for input argument #%d: Must be a valid permutation vector.\n"), "permute", 2);
 assert_checkerror("permute(x, [1 2 4]);", refMsg);
 assert_checkerror("permute(x, [1 2 3 5]);", refMsg);