* Bug #10998 fixed - Fixed matrix*hypermatrix and hypermatrix*matrix 16/13316/3
Paul Bignier [Thu, 5 Dec 2013 09:19:23 +0000 (10:19 +0100)]
matrix*hypermatrix and hypermatrix*matrix operations failed.

Change-Id: Ifc2b61ed180004336a3f02d3749ae77144ff88d5

scilab/CHANGES_5.5.X
scilab/modules/overloading/macros/%hm_m_s.sci
scilab/modules/overloading/macros/%s_m_hm.sci
scilab/modules/overloading/tests/nonreg_tests/bug_10998.dia.ref [new file with mode: 0644]
scilab/modules/overloading/tests/nonreg_tests/bug_10998.tst [new file with mode: 0644]

index e33b738..a8fa7db 100644 (file)
@@ -132,6 +132,8 @@ Scilab Bug Fixes
 
 * Bug #10936 fixed - Scilab hung with invalid strf in plot2d.
 
+* Bug #10998 fixed - matrix*hypermatrix and hypermatrix*matrix operations failed.
+
 * Bug #11007, #11008 & #11009 fixed - New function conjgrad (Conjugate Gradient methods "pcg", "cgs", "bicg" and "bicgstab").
 
 * Bug #11305 fixed - Performances improved with a better way to update data.
index e9ddd07..2998c3a 100644 (file)
@@ -8,9 +8,24 @@
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
 function M1=%hm_m_s(M1,M2)
+
+    siz1 = size(M1);
+    siz2 = size(M2);
+
     if size(M2,"*")<>1 then
-        M1=M1*mlist(["hm","dims","entries"],size(M2),matrix(M2,-1,1))
+        if length(siz1)<>3 then
+            error(msprintf(_("%s: Wrong size for input argument #%d: 3D maximum expected.\n"),"%hm_m_s",2));
+        end
+        if siz1(2)<>siz2(1) then
+            error(msprintf(_("%s: Wrong size for argument: Incompatible dimensions.\n"),"hm_m_s"));
+        end
+        res = zeros(siz1(1), siz2(2), siz1(3));
+        for i=1:siz1(3)
+            res(:, :, i) = M1(:, :, i)*M2;
+        end
+        M1 = res;
     else
-        M1.entries=M1.entries*M2
+        M1.entries = M1.entries*M2
     end
+
 endfunction
index d715a9f..4c014cb 100644 (file)
@@ -8,9 +8,21 @@
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
 function M2=%s_m_hm(M1,M2)
+
+    siz1 = size(M1);
+    siz2 = size(M2);
+
     if size(M1,"*")<>1 then
-        M2=hypermat(size(M1),M1)*M2
+        if length(siz2)<>3 then
+            error(msprintf(_("%s: Wrong size for input argument #%d: 3D maximum expected.\n"),"%s_m_hm",2));
+        end
+        if siz1(2)<>siz2(1) then
+            error(msprintf(_("%s: Wrong size for argument: Incompatible dimensions.\n"),"s_m_hm"));
+        end
+        M2 = hypermat([siz2(1) siz2(2)*siz2(3)], M2);
+        M2 = hypermat([siz1(1) siz2(2) siz2(3)], M1*M2);
     else
-        M2.entries=M1*M2.entries
+        M2.entries = M1*M2.entries
     end
+
 endfunction
diff --git a/scilab/modules/overloading/tests/nonreg_tests/bug_10998.dia.ref b/scilab/modules/overloading/tests/nonreg_tests/bug_10998.dia.ref
new file mode 100644 (file)
index 0000000..86234b0
--- /dev/null
@@ -0,0 +1,52 @@
+// =============================================================================
+// 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 10998 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=10998
+//
+// <-- Short Description -->
+// matrix*hypermatrix operation failed.
+//---------------------------------------------------
+// Matrix * Hypermatrix
+clear
+rand("seed", 0);
+test1 = rand(3, 3, 3);
+test2 = rand(3, 3, 3);
+// Multiply a 3x3 matrix by a 3x1x3 hypermatrix.
+c = test1(:, :, 1) * test2(:, 2, :);
+// Build the expected result. Its size is 3x1x3.
+refC = zeros(3, 1, 3);
+for i=1:3
+    refC(:, :, i) = test1(:, :, 1) * test2(:, 2, i);
+end
+assert_checkequal(c, refC);
+// Now with harder dimensions
+test1 = rand(5, 3);
+test2 = rand(3, 4, 3);
+// Multiply a 5x3 matrix by a 3x2x3 hypermatrix.
+c = test1(:, :) * test2(:, 1:2, :);
+// Build the expected result. Its size is 5x2x3.
+refC = zeros(5, 2, 3);
+for i=1:3
+    refC(:, :, i) = test1(:, :) * test2(:, 1:2, i);
+end
+assert_checkequal(c, refC);
+//---------------------------------------------------
+// Hypermatrix * Matrix
+test1 = rand(4, 3);
+// Multiply a 3x4x3 matrix by a 4x3 hypermatrix.
+c = test2(:, :, :) * test1(:, :);
+// Build the expected result. Its size is 3x3x3.
+refC = zeros(3, 3, 3);
+for i=1:3
+    refC(:, :, i) = test2(:, :, i) * test1(:, :);
+end
+assert_checkequal(c, refC);
diff --git a/scilab/modules/overloading/tests/nonreg_tests/bug_10998.tst b/scilab/modules/overloading/tests/nonreg_tests/bug_10998.tst
new file mode 100644 (file)
index 0000000..a1d0753
--- /dev/null
@@ -0,0 +1,67 @@
+// =============================================================================
+// 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 10998 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=10998
+//
+// <-- Short Description -->
+// matrix*hypermatrix operation failed.
+
+//---------------------------------------------------
+// Matrix * Hypermatrix
+
+clear
+rand("seed", 0);
+test1 = rand(3, 3, 3);
+test2 = rand(3, 3, 3);
+
+// Multiply a 3x3 matrix by a 3x1x3 hypermatrix.
+c = test1(:, :, 1) * test2(:, 2, :);
+
+// Build the expected result. Its size is 3x1x3.
+refC = zeros(3, 1, 3);
+for i=1:3
+    refC(:, :, i) = test1(:, :, 1) * test2(:, 2, i);
+end
+
+assert_checkequal(c, refC);
+
+
+// Now with harder dimensions
+test1 = rand(5, 3);
+test2 = rand(3, 4, 3);
+
+// Multiply a 5x3 matrix by a 3x2x3 hypermatrix.
+c = test1(:, :) * test2(:, 1:2, :);
+
+// Build the expected result. Its size is 5x2x3.
+refC = zeros(5, 2, 3);
+for i=1:3
+    refC(:, :, i) = test1(:, :) * test2(:, 1:2, i);
+end
+
+assert_checkequal(c, refC);
+
+
+//---------------------------------------------------
+// Hypermatrix * Matrix
+
+test1 = rand(4, 3);
+// Multiply a 3x4x3 matrix by a 4x3 hypermatrix.
+c = test2(:, :, :) * test1(:, :);
+
+// Build the expected result. Its size is 3x3x3.
+refC = zeros(3, 3, 3);
+for i=1:3
+    refC(:, :, i) = test2(:, :, i) * test1(:, :);
+end
+
+assert_checkequal(c, refC);