reforge dot multiplication 49/15049/5
Antoine ELIAS [Tue, 19 Aug 2014 10:40:26 +0000 (12:40 +0200)]
Change-Id: I1386d392a50e5e95754b18ae9bba05792e8717ad

25 files changed:
scilab/modules/ast/Makefile.am
scilab/modules/ast/Makefile.in
scilab/modules/ast/ast.vcxproj
scilab/modules/ast/ast.vcxproj.filters
scilab/modules/ast/includes/operations/interface_addition.h
scilab/modules/ast/includes/operations/matrix_subtraction.h [deleted file]
scilab/modules/ast/includes/operations/types_addition.hxx
scilab/modules/ast/includes/operations/types_dotmultiplication.hxx [new file with mode: 0644]
scilab/modules/ast/includes/operations/types_multiplication.hxx
scilab/modules/ast/includes/operations/types_subtraction.hxx
scilab/modules/ast/includes/types/singlepoly.hxx
scilab/modules/ast/src/c/operations/matrix_subtraction.c [deleted file]
scilab/modules/ast/src/cpp/operations/interface_addition.cpp
scilab/modules/ast/src/cpp/operations/operations.cpp
scilab/modules/ast/src/cpp/operations/types_addition.cpp
scilab/modules/ast/src/cpp/operations/types_dotmultiplication.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/operations/types_multiplication.cpp
scilab/modules/ast/src/cpp/operations/types_subtraction.cpp
scilab/modules/ast/src/cpp/types/singlepoly.cpp
scilab/modules/ast/tests/unit_tests/addition.dia.ref
scilab/modules/ast/tests/unit_tests/addition.tst
scilab/modules/ast/tests/unit_tests/dotmultiplication.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/unit_tests/dotmultiplication.tst [new file with mode: 0644]
scilab/modules/ast/tests/unit_tests/subtraction.dia.ref
scilab/modules/ast/tests/unit_tests/subtraction.tst

index 53f4d11..3c97469 100644 (file)
@@ -30,6 +30,7 @@ libsciast_la_SOURCES = \
     src/cpp/operations/types_ldivide.cpp \
     src/cpp/operations/types_comparison_eq.cpp \
     src/cpp/operations/types_multiplication.cpp \
+    src/cpp/operations/types_dotmultiplication.cpp \
     src/cpp/operations/types_comparison_lt_le_gt_ge.cpp \
     src/cpp/operations/types_or_and.cpp \
     src/cpp/operations/types_comparison_ne.cpp \
@@ -41,7 +42,6 @@ libsciast_la_SOURCES = \
     src/c/operations/matrix_transpose.c \
     src/c/operations/matrix_kronecker.c \
     src/c/operations/operations_tools.c \
-    src/c/operations/matrix_subtraction.c \
     src/c/operations/invert_matrix.c \
     src/c/operations/matrix_power.c \
     src/c/operations/matrix_division.c \
@@ -158,7 +158,6 @@ includes/operations/types_divide.hxx \
 includes/operations/types_finite.hxx \
 includes/operations/types_transposition.hxx \
 includes/operations/matrix_addition.h \
-includes/operations/matrix_subtraction.h \
 includes/operations/doublecomplex.h \
 includes/operations/types_comparison_eq.hxx \
 includes/operations/matrix_transpose.h \
index f590068..6d1c268 100644 (file)
@@ -173,6 +173,7 @@ am__libsciast_la_SOURCES_DIST = src/cpp/ast/runvisitor.cpp \
        src/cpp/operations/types_ldivide.cpp \
        src/cpp/operations/types_comparison_eq.cpp \
        src/cpp/operations/types_multiplication.cpp \
+       src/cpp/operations/types_dotmultiplication.cpp \
        src/cpp/operations/types_comparison_lt_le_gt_ge.cpp \
        src/cpp/operations/types_or_and.cpp \
        src/cpp/operations/types_comparison_ne.cpp \
@@ -184,7 +185,6 @@ am__libsciast_la_SOURCES_DIST = src/cpp/ast/runvisitor.cpp \
        src/c/operations/matrix_transpose.c \
        src/c/operations/matrix_kronecker.c \
        src/c/operations/operations_tools.c \
-       src/c/operations/matrix_subtraction.c \
        src/c/operations/invert_matrix.c \
        src/c/operations/matrix_power.c \
        src/c/operations/matrix_division.c \
@@ -244,6 +244,7 @@ am_libsciast_la_OBJECTS = src/cpp/ast/libsciast_la-runvisitor.lo \
        src/cpp/operations/libsciast_la-types_ldivide.lo \
        src/cpp/operations/libsciast_la-types_comparison_eq.lo \
        src/cpp/operations/libsciast_la-types_multiplication.lo \
+       src/cpp/operations/libsciast_la-types_dotmultiplication.lo \
        src/cpp/operations/libsciast_la-types_comparison_lt_le_gt_ge.lo \
        src/cpp/operations/libsciast_la-types_or_and.lo \
        src/cpp/operations/libsciast_la-types_comparison_ne.lo \
@@ -255,7 +256,6 @@ am_libsciast_la_OBJECTS = src/cpp/ast/libsciast_la-runvisitor.lo \
        src/c/operations/libsciast_la-matrix_transpose.lo \
        src/c/operations/libsciast_la-matrix_kronecker.lo \
        src/c/operations/libsciast_la-operations_tools.lo \
-       src/c/operations/libsciast_la-matrix_subtraction.lo \
        src/c/operations/libsciast_la-invert_matrix.lo \
        src/c/operations/libsciast_la-matrix_power.lo \
        src/c/operations/libsciast_la-matrix_division.lo \
@@ -701,6 +701,7 @@ libsciast_la_SOURCES = src/cpp/ast/runvisitor.cpp \
        src/cpp/operations/types_ldivide.cpp \
        src/cpp/operations/types_comparison_eq.cpp \
        src/cpp/operations/types_multiplication.cpp \
+       src/cpp/operations/types_dotmultiplication.cpp \
        src/cpp/operations/types_comparison_lt_le_gt_ge.cpp \
        src/cpp/operations/types_or_and.cpp \
        src/cpp/operations/types_comparison_ne.cpp \
@@ -712,7 +713,6 @@ libsciast_la_SOURCES = src/cpp/ast/runvisitor.cpp \
        src/c/operations/matrix_transpose.c \
        src/c/operations/matrix_kronecker.c \
        src/c/operations/operations_tools.c \
-       src/c/operations/matrix_subtraction.c \
        src/c/operations/invert_matrix.c \
        src/c/operations/matrix_power.c \
        src/c/operations/matrix_division.c \
@@ -801,7 +801,6 @@ includes/operations/types_divide.hxx \
 includes/operations/types_finite.hxx \
 includes/operations/types_transposition.hxx \
 includes/operations/matrix_addition.h \
-includes/operations/matrix_subtraction.h \
 includes/operations/doublecomplex.h \
 includes/operations/types_comparison_eq.hxx \
 includes/operations/matrix_transpose.h \
@@ -1174,6 +1173,9 @@ src/cpp/operations/libsciast_la-types_comparison_eq.lo:  \
 src/cpp/operations/libsciast_la-types_multiplication.lo:  \
        src/cpp/operations/$(am__dirstamp) \
        src/cpp/operations/$(DEPDIR)/$(am__dirstamp)
+src/cpp/operations/libsciast_la-types_dotmultiplication.lo:  \
+       src/cpp/operations/$(am__dirstamp) \
+       src/cpp/operations/$(DEPDIR)/$(am__dirstamp)
 src/cpp/operations/libsciast_la-types_comparison_lt_le_gt_ge.lo:  \
        src/cpp/operations/$(am__dirstamp) \
        src/cpp/operations/$(DEPDIR)/$(am__dirstamp)
@@ -1213,9 +1215,6 @@ src/c/operations/libsciast_la-matrix_kronecker.lo:  \
 src/c/operations/libsciast_la-operations_tools.lo:  \
        src/c/operations/$(am__dirstamp) \
        src/c/operations/$(DEPDIR)/$(am__dirstamp)
-src/c/operations/libsciast_la-matrix_subtraction.lo:  \
-       src/c/operations/$(am__dirstamp) \
-       src/c/operations/$(DEPDIR)/$(am__dirstamp)
 src/c/operations/libsciast_la-invert_matrix.lo:  \
        src/c/operations/$(am__dirstamp) \
        src/c/operations/$(DEPDIR)/$(am__dirstamp)
@@ -1432,7 +1431,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/operations/$(DEPDIR)/libsciast_la-matrix_kronecker.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/operations/$(DEPDIR)/libsciast_la-matrix_multiplication.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/operations/$(DEPDIR)/libsciast_la-matrix_power.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/c/operations/$(DEPDIR)/libsciast_la-matrix_subtraction.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/operations/$(DEPDIR)/libsciast_la-matrix_transpose.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/c/operations/$(DEPDIR)/libsciast_la-operations_tools.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/ast/$(DEPDIR)/libsciast_la-debugvisitor.Plo@am__quote@
@@ -1450,6 +1448,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/operations/$(DEPDIR)/libsciast_la-types_comparison_lt_le_gt_ge.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/operations/$(DEPDIR)/libsciast_la-types_comparison_ne.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/operations/$(DEPDIR)/libsciast_la-types_divide.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/operations/$(DEPDIR)/libsciast_la-types_dotmultiplication.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/operations/$(DEPDIR)/libsciast_la-types_finite.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/operations/$(DEPDIR)/libsciast_la-types_kronecker.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/operations/$(DEPDIR)/libsciast_la-types_ldivide.Plo@am__quote@
@@ -1566,13 +1565,6 @@ src/c/operations/libsciast_la-operations_tools.lo: src/c/operations/operations_t
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/c/operations/libsciast_la-operations_tools.lo `test -f 'src/c/operations/operations_tools.c' || echo '$(srcdir)/'`src/c/operations/operations_tools.c
 
-src/c/operations/libsciast_la-matrix_subtraction.lo: src/c/operations/matrix_subtraction.c
-@am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/c/operations/libsciast_la-matrix_subtraction.lo -MD -MP -MF src/c/operations/$(DEPDIR)/libsciast_la-matrix_subtraction.Tpo -c -o src/c/operations/libsciast_la-matrix_subtraction.lo `test -f 'src/c/operations/matrix_subtraction.c' || echo '$(srcdir)/'`src/c/operations/matrix_subtraction.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/c/operations/$(DEPDIR)/libsciast_la-matrix_subtraction.Tpo src/c/operations/$(DEPDIR)/libsciast_la-matrix_subtraction.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/c/operations/matrix_subtraction.c' object='src/c/operations/libsciast_la-matrix_subtraction.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@  $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o src/c/operations/libsciast_la-matrix_subtraction.lo `test -f 'src/c/operations/matrix_subtraction.c' || echo '$(srcdir)/'`src/c/operations/matrix_subtraction.c
-
 src/c/operations/libsciast_la-invert_matrix.lo: src/c/operations/invert_matrix.c
 @am__fastdepCC_TRUE@   $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT src/c/operations/libsciast_la-invert_matrix.lo -MD -MP -MF src/c/operations/$(DEPDIR)/libsciast_la-invert_matrix.Tpo -c -o src/c/operations/libsciast_la-invert_matrix.lo `test -f 'src/c/operations/invert_matrix.c' || echo '$(srcdir)/'`src/c/operations/invert_matrix.c
 @am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/c/operations/$(DEPDIR)/libsciast_la-invert_matrix.Tpo src/c/operations/$(DEPDIR)/libsciast_la-invert_matrix.Plo
@@ -1751,6 +1743,13 @@ src/cpp/operations/libsciast_la-types_multiplication.lo: src/cpp/operations/type
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/operations/libsciast_la-types_multiplication.lo `test -f 'src/cpp/operations/types_multiplication.cpp' || echo '$(srcdir)/'`src/cpp/operations/types_multiplication.cpp
 
+src/cpp/operations/libsciast_la-types_dotmultiplication.lo: src/cpp/operations/types_dotmultiplication.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/operations/libsciast_la-types_dotmultiplication.lo -MD -MP -MF src/cpp/operations/$(DEPDIR)/libsciast_la-types_dotmultiplication.Tpo -c -o src/cpp/operations/libsciast_la-types_dotmultiplication.lo `test -f 'src/cpp/operations/types_dotmultiplication.cpp' || echo '$(srcdir)/'`src/cpp/operations/types_dotmultiplication.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/operations/$(DEPDIR)/libsciast_la-types_dotmultiplication.Tpo src/cpp/operations/$(DEPDIR)/libsciast_la-types_dotmultiplication.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/operations/types_dotmultiplication.cpp' object='src/cpp/operations/libsciast_la-types_dotmultiplication.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o src/cpp/operations/libsciast_la-types_dotmultiplication.lo `test -f 'src/cpp/operations/types_dotmultiplication.cpp' || echo '$(srcdir)/'`src/cpp/operations/types_dotmultiplication.cpp
+
 src/cpp/operations/libsciast_la-types_comparison_lt_le_gt_ge.lo: src/cpp/operations/types_comparison_lt_le_gt_ge.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsciast_la_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT src/cpp/operations/libsciast_la-types_comparison_lt_le_gt_ge.lo -MD -MP -MF src/cpp/operations/$(DEPDIR)/libsciast_la-types_comparison_lt_le_gt_ge.Tpo -c -o src/cpp/operations/libsciast_la-types_comparison_lt_le_gt_ge.lo `test -f 'src/cpp/operations/types_comparison_lt_le_gt_ge.cpp' || echo '$(srcdir)/'`src/cpp/operations/types_comparison_lt_le_gt_ge.cpp
 @am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/operations/$(DEPDIR)/libsciast_la-types_comparison_lt_le_gt_ge.Tpo src/cpp/operations/$(DEPDIR)/libsciast_la-types_comparison_lt_le_gt_ge.Plo
index 95734e4..838ed74 100644 (file)
@@ -325,7 +325,6 @@ lib /DEF:"$(ProjectDir)fileio_import.def" /SUBSYSTEM:WINDOWS /MACHINE:$(Platform
     <ClInclude Include="includes\operations\matrix_multiplication.h" />
     <ClInclude Include="includes\operations\matrix_power.h" />
     <ClInclude Include="includes\operations\matrix_right_division.h" />
-    <ClInclude Include="includes\operations\matrix_subtraction.h" />
     <ClInclude Include="includes\operations\matrix_transpose.h" />
     <ClInclude Include="includes\operations\operations.hxx" />
     <ClInclude Include="includes\operations\operations_tools.h" />
@@ -335,6 +334,7 @@ lib /DEF:"$(ProjectDir)fileio_import.def" /SUBSYSTEM:WINDOWS /MACHINE:$(Platform
     <ClInclude Include="includes\operations\types_comparison_lt_le_gt_ge.hxx" />
     <ClInclude Include="includes\operations\types_comparison_ne.hxx" />
     <ClInclude Include="includes\operations\types_divide.hxx" />
+    <ClInclude Include="includes\operations\types_dotmultiplication.hxx" />
     <ClInclude Include="includes\operations\types_finite.hxx" />
     <ClInclude Include="includes\operations\types_kronecker.hxx" />
     <ClInclude Include="includes\operations\types_ldivide.hxx" />
@@ -433,6 +433,7 @@ lib /DEF:"$(ProjectDir)fileio_import.def" /SUBSYSTEM:WINDOWS /MACHINE:$(Platform
     <ClCompile Include="src\cpp\operations\types_comparison_lt_le_gt_ge.cpp" />
     <ClCompile Include="src\cpp\operations\types_comparison_ne.cpp" />
     <ClCompile Include="src\cpp\operations\types_divide.cpp" />
+    <ClCompile Include="src\cpp\operations\types_dotmultiplication.cpp" />
     <ClCompile Include="src\cpp\operations\types_finite.cpp" />
     <ClCompile Include="src\cpp\operations\types_kronecker.cpp" />
     <ClCompile Include="src\cpp\operations\types_ldivide.cpp" />
@@ -504,7 +505,6 @@ lib /DEF:"$(ProjectDir)fileio_import.def" /SUBSYSTEM:WINDOWS /MACHINE:$(Platform
     <ClCompile Include="src\c\operations\matrix_kronecker.c" />
     <ClCompile Include="src\c\operations\matrix_multiplication.c" />
     <ClCompile Include="src\c\operations\matrix_power.c" />
-    <ClCompile Include="src\c\operations\matrix_subtraction.c" />
     <ClCompile Include="src\c\operations\matrix_transpose.c" />
     <ClCompile Include="src\c\operations\operations_tools.c" />
   </ItemGroup>
index 797b203..9f03afe 100644 (file)
     <ClInclude Include="includes\operations\types_subtraction.hxx">
       <Filter>Header Files\operations</Filter>
     </ClInclude>
-    <ClInclude Include="includes\operations\matrix_subtraction.h">
+    <ClInclude Include="includes\operations\types_dotmultiplication.hxx">
       <Filter>Header Files\operations</Filter>
     </ClInclude>
   </ItemGroup>
     <ClCompile Include="src\cpp\operations\types_subtraction.cpp">
       <Filter>Source Files\operations</Filter>
     </ClCompile>
-    <ClCompile Include="src\c\operations\matrix_subtraction.c">
+    <ClCompile Include="src\cpp\operations\types_dotmultiplication.cpp">
       <Filter>Source Files\operations</Filter>
     </ClCompile>
   </ItemGroup>
index d5d407c..2dd4d55 100644 (file)
 #define __INTERFACE_ADD_H__
 
 /* addition double */
-void add_ll_D_D(double* l, double* r, int size, double* o);
-void add_ll_D_DC(double* l, double* r, double* rc, int size, double* o, double* oc);
-void add_ll_D_D1(double* l, double r, int size, double* o);
-void add_ll_D_D1C(double* l, double r, double rc, int size, double* o, double* oc);
-void add_ll_D_E(double* l, int size, double* o);
-
-void add_ll_DC_D(double* l, double* lc, double* r, int size, double* o, double* oc);
-void add_ll_DC_DC(double* l, double* lc, double* r, double* rc, int size, double* o, double* oc);
-void add_ll_DC_D1(double* l, double* lc, double r, int size, double* o, double* oc);
-void add_ll_DC_D1C(double* l, double* lc, double r, double rc, int size, double* o, double* oc);
-void add_ll_DC_E(double* l, double* lc, int size, double* o, double* oc);
-
-void add_ll_D1_D(double l, double* r, int size, double* o);
-void add_ll_D1_DC(double l, double* r, double* rc, int size, double* o, double* oc);
+void add_ll_D_D(double* l, double* r, size_t size, double* o);
+void add_ll_D_DC(double* l, double* r, double* rc, size_t size, double* o, double* oc);
+void add_ll_D_D1(double* l, double r, size_t size, double* o);
+void add_ll_D_D1C(double* l, double r, double rc, size_t size, double* o, double* oc);
+void add_ll_D_E(double* l, size_t size, double* o);
+
+void add_ll_DC_D(double* l, double* lc, double* r, size_t size, double* o, double* oc);
+void add_ll_DC_DC(double* l, double* lc, double* r, double* rc, size_t size, double* o, double* oc);
+void add_ll_DC_D1(double* l, double* lc, double r, size_t size, double* o, double* oc);
+void add_ll_DC_D1C(double* l, double* lc, double r, double rc, size_t size, double* o, double* oc);
+void add_ll_DC_E(double* l, double* lc, size_t size, double* o, double* oc);
+
+void add_ll_D1_D(double l, double* r, size_t size, double* o);
+void add_ll_D1_DC(double l, double* r, double* rc, size_t size, double* o, double* oc);
 void add_ll_D1_D1(double l, double r, double* o);
 void add_ll_D1_D1C(double l, double r, double rc, double* o, double* oc);
 void add_ll_D1_E(double l, double* o);
 
-void add_ll_D1C_D(double l, double lc, double* r, int size, double* o, double* oc);
-void add_ll_D1C_DC(double l, double lc, double* r, double* rc, int size, double* o, double* oc);
+void add_ll_D1C_D(double l, double lc, double* r, size_t size, double* o, double* oc);
+void add_ll_D1C_DC(double l, double lc, double* r, double* rc, size_t size, double* o, double* oc);
 void add_ll_D1C_D1(double l, double lc, double r, double* o, double* oc);
 void add_ll_D1C_D1C(double l, double lc, double r, double rc, double* o, double* oc);
 void add_ll_D1C_E(double l, double lc, double* o, double* oc);
 
-void add_ll_E_D(double* r, int size, double* o);
-void add_ll_E_DC(double* r, double* rc, int size, double* o, double* oc);
+void add_ll_E_D(double* r, size_t size, double* o);
+void add_ll_E_DC(double* r, double* rc, size_t size, double* o, double* oc);
 void add_ll_E_D1(double r, double* o);
 void add_ll_E_D1C(double r, double rc, double* o, double* oc);
 void add_ll_E_E();
 
 
-#endif /* !__INTERFACE_ADD_H__ */
\ No newline at end of file
+#endif /* !__INTERFACE_ADD_H__ */
diff --git a/scilab/modules/ast/includes/operations/matrix_subtraction.h b/scilab/modules/ast/includes/operations/matrix_subtraction.h
deleted file mode 100644 (file)
index b9ebcdb..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
-*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-*  Copyright (C) 2009 - DIGITEO - Antoine ELIAS
-*
-*  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
-*  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
-*
-*/
-
-#ifndef __MATRIX_SUBTRACT_H__
-#define __MATRIX_SUBTRACT_H__
-
-int iSubstractRealIdentityToRealMatrix(double _dblReal1, double* _pdblReal2, int _iRows2, int _iCols2, double* _pdblRealOut);
-int iSubstractRealIdentityToComplexMatrix(double _dblReal1, double* _pdblReal2, double* _pdblImg2, int _iRows2, int _iCols2, double* _pdblRealOut, double* _pdblImgOut);
-int iSubstractComplexIdentityToRealMatrix(double _dblReal1, double _dblImg1, double* _pdblReal2, int _iRows2, int _iCols2, double* _pdblRealOut, double* _pdblImgOut);
-int iSubstractComplexIdentityToComplexMatrix(double _dblReal1, double _dblImg1, double* _pdblReal2, double* _pdblImg2, int _iRows2, int _iCols2, double* _pdblRealOut, double* _pdblImgOut);
-
-int iSubstractRealMatrixToRealScalar(double* _pdblReal1, int* _piDims1, int _iDims1, double _dblReal2, double* _pdblRealOut);
-int iSubstractComplexMatrixToRealScalar(double* _pdblReal1, double* _pdblImg1, int* _piDims1, int _iDims1, double _dblReal2, double* _pdblRealOut, double* _pdblImgOut);
-int iSubstractRealMatrixToComplexScalar(double* _pdblReal1, int* _piDims1, int _iDims1, double _dblReal2, double _dblImg2, double* _pdblRealOut, double* _pdblImgOut);
-int iSubstractComplexMatrixToComplexScalar(double* _pdblReal1, double* _pdblImg1, int* _piDims1, int _iDims1, double _dblReal2, double _dblImg2, double* _pdblRealOut, double* _pdblImgOut);
-
-int iSubstractRealScalarToRealMatrix(double _dblReal1, double* _pdblReal2, int* _piDims2, int _iDims2, double* _pdblRealOut);
-int iSubstractComplexScalarToRealMatrix(double _dblReal1, double _dblImg1, double* _pdblReal2, int* _piDims2, int _iDims2, double* _pdblRealOut, double* _pdblImgOut);
-int iSubstractRealScalarToComplexMatrix(double _dblReal1, double* _pdblReal2, double* _pdblImg2, int* _piDims2, int _iDims2, double* _pdblRealOut, double* _pdblImgOut);
-int iSubstractComplexScalarToComplexMatrix(double _dblReal1, double _dblImg1, double* _pdblReal2, double* _pdblImg2, int* _piDims2, int _iDims2, double* _pdblRealOut, double* _pdblImgOut);
-
-int iSubstractRealMatrixToRealMatrix(double* _pdblReal1, double* _pdblReal2, int* _piDims, int _iDims, double* _pdblRealOut);
-int iSubstractComplexMatrixToRealMatrix(double* _pdblReal1, double* _pdblImg1, double* _pdblReal2, int* _piDims, int _iDims, double* _pdblRealOut, double* _pdblImgOut);
-int iSubstractRealMatrixToComplexMatrix(double* _pdblReal1, double* _pdblReal2, double* _pdblImg2, int* _piDims, int _iDims, double* _pdblRealOut, double* _pdblImgOut);
-int iSubstractComplexMatrixToComplexMatrix(double* _pdblReal1, double* _pdblImg1, double* _pdblReal2, double* _pdblImg2, int* _piDims, int _iDims, double* _pdblRealOut, double* _pdblImgOut);
-
-#endif /* __MATRIX_SUBTRACT_H__ */
index ff93ec2..f35a5c5 100644 (file)
@@ -110,6 +110,8 @@ template<> inline types::InternalType* add_E_S<types::Double, types::String, typ
 template<> inline types::InternalType* add_M_M<types::Polynom, types::Polynom, types::Polynom>(types::Polynom* _pL, types::Polynom* _pR);
 template<> inline types::InternalType* add_M_M<types::Polynom, types::Double, types::Polynom>(types::Polynom* _pL, types::Double* _pR);
 template<> inline types::InternalType* add_M_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
+template<> inline types::InternalType* add_M_I<types::Polynom, types::Double, types::Polynom>(types::Polynom* _pL, types::Double* _pR);
+template<> inline types::InternalType* add_I_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
 
 template<> inline types::InternalType* add_M_M<types::Sparse, types::Sparse, types::Sparse>(types::Sparse* _pL, types::Sparse* _pR);
 template<> inline types::InternalType* add_M_M<types::Double, types::Sparse, types::Double>(types::Double* _pL, types::Sparse* _pR);
@@ -119,27 +121,27 @@ template<> inline types::InternalType* add_M_M<types::Sparse, types::Double, typ
 
 //add matrix + matrix ( double, int, bool )
 //same type
-template<typename T, typename O> inline static void add(T* l, long long size, T* r, O* o)
+template<typename T, typename O> inline static void add(T* l, size_t size, T* r, O* o)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] + (O)r[i];
     }
 }
 
 //string version
-inline static void add(wchar_t** l, long long size, wchar_t** r, int* length , wchar_t** o)
+inline static void add(wchar_t** l, size_t size, wchar_t** r, int* length , wchar_t** o)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         os_swprintf(o[i], length[i], L"%ls%ls", l[i], r[i]);
     }
 }
 
 //x + x
-template<typename T, typename U, typename O> inline static void add(T* l, long long size, U* r, O* o)
+template<typename T, typename U, typename O> inline static void add(T* l, size_t size, U* r, O* o)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] + (O)r[i];
     }
@@ -147,9 +149,9 @@ template<typename T, typename U, typename O> inline static void add(T* l, long l
 
 
 //x + xC
-template<typename T, typename U, typename O> inline static void add(T* l, long long size, U* r, U* rc, O* o, O* oc)
+template<typename T, typename U, typename O> inline static void add(T* l, size_t size, U* r, U* rc, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] + (O)r[i];
         oc[i] = (O)rc[i];
@@ -157,9 +159,9 @@ template<typename T, typename U, typename O> inline static void add(T* l, long l
 }
 
 //xC + x
-template<typename T, typename U, typename O> inline static void add(T* l, T* lc, long long size, U* r, O* o, O* oc)
+template<typename T, typename U, typename O> inline static void add(T* l, T* lc, size_t size, U* r, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] + (O)r[i];
         oc[i] = (O)lc[i];
@@ -167,9 +169,9 @@ template<typename T, typename U, typename O> inline static void add(T* l, T* lc,
 }
 
 // xC + xC
-template<typename T, typename O> inline static void add(T* l, T* lc, long long size, T* r, T* rc, O* o, O* oc)
+template<typename T, typename O> inline static void add(T* l, T* lc, size_t size, T* r, T* rc, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] + (O)r[i];
         oc[i] = (O)lc[i] + (O)rc[i];
@@ -177,18 +179,18 @@ template<typename T, typename O> inline static void add(T* l, T* lc, long long s
 }
 
 // x + [] and [] + x
-template<typename T, typename O> inline static void add(T* l, long long size, O* o)
+template<typename T, typename O> inline static void add(T* l, size_t size, O* o)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i];
     }
 }
 
 // xC + [] and [] + xC
-template<typename T, typename O> inline static void add(T* l, T* lc, long long size, O* o, O* oc)
+template<typename T, typename O> inline static void add(T* l, T* lc, size_t size, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i];
         oc[i] = (O)lc[i];
@@ -197,27 +199,27 @@ template<typename T, typename O> inline static void add(T* l, T* lc, long long s
 
 //add matrix + scalar ( double, int, bool )
 //x + x1
-template<typename T, typename U, typename O> inline static void add(T* l, long long size, U r, O* o)
+template<typename T, typename U, typename O> inline static void add(T* l, size_t size, U r, O* o)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] + (O)r;
     }
 }
 
 //string version
-inline static void add(wchar_t** l, long long size, wchar_t* r, int* length , wchar_t** o)
+inline static void add(wchar_t** l, size_t size, wchar_t* r, int* length , wchar_t** o)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         os_swprintf(o[i], length[i], L"%ls%ls", l[i], r);
     }
 }
 
 //xC + x1
-template<typename T, typename U, typename O> inline static void add(T* l, T* lc, long long size, U r, O* o, O* oc)
+template<typename T, typename U, typename O> inline static void add(T* l, T* lc, size_t size, U r, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] + (O)r;
         oc[i] = (O)lc[i];
@@ -225,9 +227,9 @@ template<typename T, typename U, typename O> inline static void add(T* l, T* lc,
 }
 
 //x + x1C
-template<typename T, typename U, typename O> inline static void add(T* l, long long size, U r, U rc, O* o, O* oc)
+template<typename T, typename U, typename O> inline static void add(T* l, size_t size, U r, U rc, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] + (O) r;
         oc[i] = (O)rc;
@@ -235,9 +237,9 @@ template<typename T, typename U, typename O> inline static void add(T* l, long l
 }
 
 //xC + x1C )
-template<typename T, typename O> inline static void add(T* l, T* lc, long long size, T r, T rc, O* o, O* oc)
+template<typename T, typename O> inline static void add(T* l, T* lc, size_t size, T r, T rc, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] + (O)r;
         oc[i] = (O)lc[i] + (O)rc;
@@ -246,27 +248,27 @@ template<typename T, typename O> inline static void add(T* l, T* lc, long long s
 
 //add scalar + matrix ( double, int, bool )
 //x1 + x
-template<typename T, typename U, typename O> inline static void add(T l, long long size, U* r, O* o)
+template<typename T, typename U, typename O> inline static void add(T l, size_t size, U* r, O* o)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l + (O)r[i];
     }
 }
 
 //string version
-inline static void add(wchar_t* l, long long size, wchar_t** r, int* length , wchar_t** o)
+inline static void add(wchar_t* l, size_t size, wchar_t** r, int* length , wchar_t** o)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         os_swprintf(o[i], length[i], L"%ls%ls", l, r[i]);
     }
 }
 
 //x1 + xC
-template<typename T, typename U, typename O> inline static void add(T l, long long size, U* r, U* rc, O* o, O* oc)
+template<typename T, typename U, typename O> inline static void add(T l, size_t size, U* r, U* rc, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l + (O)r[i];
         oc[i] = (O)rc[i];
@@ -274,9 +276,9 @@ template<typename T, typename U, typename O> inline static void add(T l, long lo
 }
 
 //x1C + x
-template<typename T, typename U, typename O> inline static void add(T l, T lc, long long size, U* r, O* o, O* oc)
+template<typename T, typename U, typename O> inline static void add(T l, T lc, size_t size, U* r, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l + (O)r[i];
         oc[i] = (O)lc;
@@ -284,9 +286,9 @@ template<typename T, typename U, typename O> inline static void add(T l, T lc, l
 }
 
 //x1C + xC
-template<typename T, typename O> inline static void add(T l, T lc, long long size, T* r, T* rc, O* o, O* oc)
+template<typename T, typename O> inline static void add(T l, T lc, size_t size, T* r, T* rc, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l + (O)r[i];
         oc[i] = (O)rc[i];
diff --git a/scilab/modules/ast/includes/operations/types_dotmultiplication.hxx b/scilab/modules/ast/includes/operations/types_dotmultiplication.hxx
new file mode 100644 (file)
index 0000000..55979cb
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+*  Copyright (C) 2014 - Scilab enterprises - Antoine ELIAS
+*
+*  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
+*  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+*
+*/
+#ifndef __TYPES_DOTMULTIPLICATION_HXX__
+#define __TYPES_DOTMULTIPLICATION_HXX__
+
+#include "generic_operations.hxx"
+#include "double.hxx"
+#include "polynom.hxx"
+#include "sparse.hxx"
+
+void fillDotMulFunction();
+
+//define arrays on operation functions
+typedef types::InternalType*(*dotmul_function)(types::InternalType*, types::InternalType*);
+
+#define DECLARE_DOTMUL_PROTO(x) template<class T, class U, class O> inline types::InternalType* x(T *_pL, U *_pR)
+DECLARE_DOTMUL_PROTO(dotmul_M_M);
+DECLARE_DOTMUL_PROTO(dotmul_M_MC);
+DECLARE_DOTMUL_PROTO(dotmul_M_S);
+DECLARE_DOTMUL_PROTO(dotmul_M_SC);
+DECLARE_DOTMUL_PROTO(dotmul_M_E);
+DECLARE_DOTMUL_PROTO(dotmul_M_I);
+DECLARE_DOTMUL_PROTO(dotmul_M_IC);
+
+DECLARE_DOTMUL_PROTO(dotmul_MC_M);
+DECLARE_DOTMUL_PROTO(dotmul_MC_MC);
+DECLARE_DOTMUL_PROTO(dotmul_MC_S);
+DECLARE_DOTMUL_PROTO(dotmul_MC_SC);
+DECLARE_DOTMUL_PROTO(dotmul_MC_I);
+DECLARE_DOTMUL_PROTO(dotmul_MC_IC);
+
+DECLARE_DOTMUL_PROTO(dotmul_S_M);
+DECLARE_DOTMUL_PROTO(dotmul_S_MC);
+DECLARE_DOTMUL_PROTO(dotmul_S_S);
+DECLARE_DOTMUL_PROTO(dotmul_S_SC);
+DECLARE_DOTMUL_PROTO(dotmul_S_I);
+DECLARE_DOTMUL_PROTO(dotmul_S_IC);
+
+DECLARE_DOTMUL_PROTO(dotmul_SC_M);
+DECLARE_DOTMUL_PROTO(dotmul_SC_MC);
+DECLARE_DOTMUL_PROTO(dotmul_SC_S);
+DECLARE_DOTMUL_PROTO(dotmul_SC_SC);
+DECLARE_DOTMUL_PROTO(dotmul_SC_I);
+DECLARE_DOTMUL_PROTO(dotmul_SC_IC);
+
+//[]
+DECLARE_DOTMUL_PROTO(dotmul_E_M);
+
+//eye
+DECLARE_DOTMUL_PROTO(dotmul_I_M);
+DECLARE_DOTMUL_PROTO(dotmul_I_MC);
+DECLARE_DOTMUL_PROTO(dotmul_I_S);
+DECLARE_DOTMUL_PROTO(dotmul_I_SC);
+DECLARE_DOTMUL_PROTO(dotmul_I_I);
+DECLARE_DOTMUL_PROTO(dotmul_I_IC);
+
+DECLARE_DOTMUL_PROTO(dotmul_IC_M);
+DECLARE_DOTMUL_PROTO(dotmul_IC_MC);
+DECLARE_DOTMUL_PROTO(dotmul_IC_S);
+DECLARE_DOTMUL_PROTO(dotmul_IC_SC);
+DECLARE_DOTMUL_PROTO(dotmul_IC_I);
+DECLARE_DOTMUL_PROTO(dotmul_IC_IC);
+
+#undef DECLARE_DOTMUL_PROTO
+
+template<> inline types::InternalType* dotmul_M_M<types::Sparse, types::Sparse, types::Sparse>(types::Sparse* _pL, types::Sparse* _pR);
+template<> inline types::InternalType* dotmul_M_M<types::Double, types::Sparse, types::Double>(types::Double* _pL, types::Sparse* _pR);
+template<> inline types::InternalType* dotmul_M_M<types::Sparse, types::Double, types::Double>(types::Sparse* _pL, types::Double* _pR);
+template<> inline types::InternalType* dotmul_M_M<types::Double, types::Sparse, types::Sparse>(types::Double* _pL, types::Sparse* _pR);
+template<> inline types::InternalType* dotmul_M_M<types::Sparse, types::Double, types::Sparse>(types::Sparse* _pL, types::Double* _pR);
+
+template<> inline types::InternalType* dotmul_M_M<types::Polynom, types::Polynom, types::Polynom>(types::Polynom* _pL, types::Polynom* _pR);
+template<> inline types::InternalType* dotmul_M_M<types::Polynom, types::Double, types::Polynom>(types::Polynom* _pL, types::Double* _pR);
+template<> inline types::InternalType* dotmul_M_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
+
+
+
+//x .* x
+template<typename T, typename U, typename O> inline static void dotmul(T* l, size_t size, U* r, O* o)
+{
+    for (size_t i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] * (O)r[i];
+    }
+}
+
+//xC .* x
+template<typename T, typename U, typename O> inline static void dotmul(T* l, T* lc, size_t size, U* r, O* o, O* oc)
+{
+    for (size_t i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] * (O)r[i];
+        oc[i] = (O)lc[i] * (O)r[i];
+    }
+}
+
+//x .* xC
+template<typename T, typename U, typename O> inline static void dotmul(T* l, size_t size, U* r, U* rc, O* o, O* oc)
+{
+    for (size_t i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] * (O)r[i];
+        oc[i] = (O)l[i] * (O)rc[i];
+    }
+}
+
+//xC .* xC
+template<typename T, typename U, typename O> inline static void dotmul(T* l, T* lc, size_t size, U* r, U* rc, O* o, O* oc)
+{
+    for (size_t i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] * (O)r[i] - (O)lc[i] * (O)rc[i];
+        oc[i] = (O)l[i] * (O)rc[i] + (O)lc[i] * (O)r[i];
+    }
+}
+
+//x1 .* x1
+template<typename T, typename U, typename O> inline static void dotmul(T l, U r, O* o)
+{
+    *o = (O)l * (O)r;
+}
+
+//x1 .* x1c
+template<typename T, typename U, typename O> inline static void dotmul(T l, size_t size, U r, U rc, O* o, O* oc)
+{
+    *o = (O)l * (O)r;
+    *oc = (O)l * (O)rc;
+}
+
+//x1c .* x1
+template<typename T, typename U, typename O> inline static void dotmul(T l, T lc, size_t size, U r, O* o, O* oc)
+{
+    *o = (O)l * (O)r;
+    *oc = (O)lc * (O)r;
+}
+
+//x1c .* x1c
+template<typename T, typename U, typename O> inline static void dotmul(T l, T lc, size_t size, U r, U rc, O* o, O* oc)
+{
+    *o = (O)l * (O)r - (O)lc * (O)rc;
+    *oc = (O)lc * (O)r + (O)l * (O)rc;
+}
+
+//x .* x1
+template<typename T, typename U, typename O> inline static void dotmul(T* l, size_t size, U r, O* o)
+{
+    for (size_t i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] * (O)r;
+    }
+}
+
+//x .* x1c
+template<typename T, typename U, typename O> inline static void dotmul(T* l, size_t size, U r, U rc, O* o, O* oc)
+{
+    for (size_t i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] * (O)r;
+        oc[i] = (O)l[i] * (O)rc;
+    }
+}
+
+//xC .* x1
+template<typename T, typename U, typename O> inline static void dotmul(T* l, T* lc, size_t size, U r, O* o, O* oc)
+{
+    for (size_t i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] * (O)r;
+        oc[i] = (O)lc[i] * (O)r;
+    }
+}
+
+//xC .* x1c
+template<typename T, typename U, typename O> inline static void dotmul(T* l, T* lc, size_t size, U r, U rc, O* o, O* oc)
+{
+    for (size_t i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] * (O)r - (O)lc[i] * (O)rc;
+        oc[i] = (O)lc[i] * (O)r + (O)l[i] * (O)rc;
+    }
+}
+
+#endif /* !__TYPES_DOTMULTIPLICATION_HXX__ */
index de3c31b..579b59f 100644 (file)
@@ -35,4 +35,5 @@ int DotMultiplySparseByDouble(types::Sparse* _pSparse1, types::Double* _pDouble2
 int DotMultiplyDoubleByPoly(types::Double* _pDouble, types::Polynom* _pPoly, types::Polynom**  _pPolyOut);
 int DotMultiplyPolyByDouble(types::Polynom* _pPoly, types::Double* _pDouble, types::Polynom**  _pPolyOut);
 int DotMultiplyPolyByPoly(types::Polynom* _pPoly1, types::Polynom* _pPoly2, types::Polynom**  _pPolyOut);
+
 #endif /* __TYPES_MULTIPLICATION_HXX__ */
index 51ba48d..c499628 100644 (file)
@@ -103,18 +103,18 @@ template<> inline types::InternalType* sub_M_M<types::Sparse, types::Double, typ
 
 //add matrix - matrix ( double, int, bool )
 //same type
-template<typename T, typename O> inline static void sub(T* l, long long size, T* r, O* o)
+template<typename T, typename O> inline static void sub(T* l, size_t size, T* r, O* o)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] - (O)r[i];
     }
 }
 
 //x - x
-template<typename T, typename U, typename O> inline static void sub(T* l, long long size, U* r, O* o)
+template<typename T, typename U, typename O> inline static void sub(T* l, size_t size, U* r, O* o)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] - (O)r[i];
     }
@@ -122,9 +122,9 @@ template<typename T, typename U, typename O> inline static void sub(T* l, long l
 
 
 //x - xC
-template<typename T, typename U, typename O> inline static void sub(T* l, long long size, U* r, U* rc, O* o, O* oc)
+template<typename T, typename U, typename O> inline static void sub(T* l, size_t size, U* r, U* rc, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] - (O)r[i];
         oc[i] = (O) - rc[i];
@@ -132,9 +132,9 @@ template<typename T, typename U, typename O> inline static void sub(T* l, long l
 }
 
 //xC - x
-template<typename T, typename U, typename O> inline static void sub(T* l, T* lc, long long size, U* r, O* o, O* oc)
+template<typename T, typename U, typename O> inline static void sub(T* l, T* lc, size_t size, U* r, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] - (O)r[i];
         oc[i] = (O)lc[i];
@@ -142,9 +142,9 @@ template<typename T, typename U, typename O> inline static void sub(T* l, T* lc,
 }
 
 // xC - xC
-template<typename T, typename O> inline static void sub(T* l, T* lc, long long size, T* r, T* rc, O* o, O* oc)
+template<typename T, typename O> inline static void sub(T* l, T* lc, size_t size, T* r, T* rc, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] - (O)r[i];
         oc[i] = (O)lc[i] - (O)rc[i];
@@ -153,18 +153,18 @@ template<typename T, typename O> inline static void sub(T* l, T* lc, long long s
 
 //add matrix - scalar ( double, int, bool )
 //x - x1
-template<typename T, typename U, typename O> inline static void sub(T* l, long long size, U r, O* o)
+template<typename T, typename U, typename O> inline static void sub(T* l, size_t size, U r, O* o)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] - (O)r;
     }
 }
 
 //xC - x1
-template<typename T, typename U, typename O> inline static void sub(T* l, T* lc, long long size, U r, O* o, O* oc)
+template<typename T, typename U, typename O> inline static void sub(T* l, T* lc, size_t size, U r, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] - (O)r;
         oc[i] = (O)lc[i];
@@ -172,9 +172,9 @@ template<typename T, typename U, typename O> inline static void sub(T* l, T* lc,
 }
 
 //x - x1C
-template<typename T, typename U, typename O> inline static void sub(T* l, long long size, U r, U rc, O* o, O* oc)
+template<typename T, typename U, typename O> inline static void sub(T* l, size_t size, U r, U rc, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] - (O) r;
         oc[i] = (O) - rc;
@@ -182,9 +182,9 @@ template<typename T, typename U, typename O> inline static void sub(T* l, long l
 }
 
 //xC - x1C
-template<typename T, typename O> inline static void sub(T* l, T* lc, long long size, T r, T rc, O* o, O* oc)
+template<typename T, typename O> inline static void sub(T* l, T* lc, size_t size, T r, T rc, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l[i] - (O)r;
         oc[i] = (O)lc[i] - (O)rc;
@@ -193,18 +193,18 @@ template<typename T, typename O> inline static void sub(T* l, T* lc, long long s
 
 //add scalar - matrix ( double, int, bool )
 //x1 - x
-template<typename T, typename U, typename O> inline static void sub(T l, long long size, U* r, O* o)
+template<typename T, typename U, typename O> inline static void sub(T l, size_t size, U* r, O* o)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l - (O)r[i];
     }
 }
 
 //x1 - xC
-template<typename T, typename U, typename O> inline static void sub(T l, long long size, U* r, U* rc, O* o, O* oc)
+template<typename T, typename U, typename O> inline static void sub(T l, size_t size, U* r, U* rc, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l - (O)r[i];
         oc[i] = (O) - rc[i];
@@ -212,9 +212,9 @@ template<typename T, typename U, typename O> inline static void sub(T l, long lo
 }
 
 //x1C - x
-template<typename T, typename U, typename O> inline static void sub(T l, T lc, long long size, U* r, O* o, O* oc)
+template<typename T, typename U, typename O> inline static void sub(T l, T lc, size_t size, U* r, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l - (O)r[i];
         oc[i] = (O)lc;
@@ -222,9 +222,9 @@ template<typename T, typename U, typename O> inline static void sub(T l, T lc, l
 }
 
 //x1C - xC
-template<typename T, typename O> inline static void sub(T l, T lc, long long size, T* r, T* rc, O* o, O* oc)
+template<typename T, typename O> inline static void sub(T l, T lc, size_t size, T* r, T* rc, O* o, O* oc)
 {
-    for (int i = 0; i < size ; ++i)
+    for (size_t i = 0; i < size ; ++i)
     {
         o[i] = (O)l - (O)r[i];
         oc[i] = (O)lc - rc[i];
index 6baebcc..3c39f31 100644 (file)
@@ -87,6 +87,9 @@ private :
     void                    toStringInternal(double *_pdblVal, std::wstring _szVar, std::list<std::wstring>* _pListExp , std::list<std::wstring>* _pListCoef);
 
 };
+
+SinglePoly* operator*(const SinglePoly& lhs, const SinglePoly& rhs);
+
 }
 
 #endif /* !__POLY_HH__ */
diff --git a/scilab/modules/ast/src/c/operations/matrix_subtraction.c b/scilab/modules/ast/src/c/operations/matrix_subtraction.c
deleted file mode 100644 (file)
index 9ab0a19..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
-*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-*  Copyright (C) 2009 - DIGITEO - Antoine ELIAS
-*
-*  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
-*  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
-*
-*/
-
-#include "core_math.h"
-#include "matrix_subtraction.h"
-#include "operations_tools.h"
-#include "string.h"
-
-//Matrix - eye
-int iSubstractRealIdentityToRealMatrix(double _dblReal1, double* _pdblReal2, int _iRows2, int _iCols2, double* _pdblRealOut)
-{
-    int i = 0;
-    memcpy(_pdblRealOut, _pdblReal2, sizeof(double) * _iRows2 * _iCols2);
-    for (i = 0 ; i < Min(_iRows2, _iCols2) ; i++)
-    {
-        _pdblRealOut[i * _iRows2 + i]  -= _dblReal1;
-    }
-    return 0;
-}
-
-int iSubstractRealIdentityToComplexMatrix(double _dblReal1, double* _pdblReal2, double* _pdblImg2, int _iRows2, int _iCols2, double* _pdblRealOut, double* _pdblImgOut)
-{
-    int i = 0;
-    memcpy(_pdblRealOut, _pdblReal2, sizeof(double) * _iRows2 * _iCols2);
-    memcpy(_pdblImgOut,                _pdblImg2       , sizeof(double) * _iRows2 * _iCols2);
-    for (i = 0 ; i < Min(_iRows2, _iCols2) ; i++)
-    {
-        _pdblRealOut[i * _iRows2 + i]  -= _dblReal1;
-    }
-    return 0;
-}
-
-int iSubstractComplexIdentityToRealMatrix(double _dblReal1, double _dblImg1, double* _pdblReal2, int _iRows2, int _iCols2, double* _pdblRealOut, double* _pdblImgOut)
-{
-    int i = 0;
-    memcpy(_pdblRealOut, _pdblReal2, sizeof(double) * _iRows2 * _iCols2);
-    memset(_pdblImgOut,                0x00, sizeof(double) * _iRows2 * _iCols2);
-    for (i = 0 ; i < Min(_iRows2, _iCols2) ; i++)
-    {
-        _pdblRealOut[i * _iRows2 + i]  -= _dblReal1;
-        _pdblImgOut[i * _iRows2 + i]   -= _dblImg1;
-    }
-    return 0;
-}
-
-int iSubstractComplexIdentityToComplexMatrix(double _dblReal1, double _dblImg1, double* _pdblReal2, double* _pdblImg2, int _iRows2, int _iCols2, double* _pdblRealOut, double* _pdblImgOut)
-{
-    int i = 0;
-    memcpy(_pdblRealOut,       _pdblReal2, sizeof(double) * _iRows2 * _iCols2);
-    memcpy(_pdblImgOut,                _pdblImg2       , sizeof(double) * _iRows2 * _iCols2);
-    for (i = 0 ; i < Min(_iRows2, _iCols2) ; i++)
-    {
-        _pdblRealOut[i * _iRows2 + i]  -= _dblReal1;
-        _pdblImgOut[i * _iRows2 + i]   -= _dblImg1;
-    }
-    return 0;
-}
-
-//Scalar - Matrix
-int iSubstractRealMatrixToRealScalar(double* _pdblReal1, int* _piDims1, int _iDims1, double _dblReal2, double* _pdblRealOut)
-{
-    int i = 0;
-    int iSize1 = GetSize(_piDims1, _iDims1);
-    for (i = 0 ; i < iSize1 ; i++)
-    {
-        _pdblRealOut[i] = _dblReal2 - _pdblReal1[i];
-    }
-    return 0;
-}
-
-int iSubstractComplexMatrixToRealScalar(double* _pdblReal1, double* _pdblImg1, int* _piDims1, int _iDims1, double _dblReal2, double* _pdblRealOut, double* _pdblImgOut)
-{
-    int i = 0;
-    int iSize1 = GetSize(_piDims1, _iDims1);
-    for (i = 0 ; i < iSize1 ; i++)
-    {
-        _pdblRealOut[i] = _dblReal2 - _pdblReal1[i];
-        _pdblImgOut[i] = - _pdblImg1[i];
-    }
-    return 0;
-}
-
-int iSubstractRealMatrixToComplexScalar(double* _pdblReal1, int* _piDims1, int _iDims1, double _dblReal2, double _dblImg2, double* _pdblRealOut, double* _pdblImgOut)
-{
-    int i = 0;
-    int iSize1 = GetSize(_piDims1, _iDims1);
-    for (i = 0 ; i < iSize1 ; i++)
-    {
-        _pdblRealOut[i] = _dblReal2 - _pdblReal1[i];
-        _pdblImgOut[i] = _dblImg2;
-    }
-    return 0;
-}
-
-int iSubstractComplexMatrixToComplexScalar(double* _pdblReal1, double* _pdblImg1, int* _piDims1, int _iDims1, double _dblReal2, double _dblImg2, double* _pdblRealOut, double* _pdblImgOut)
-{
-    int i = 0;
-    int iSize1 = GetSize(_piDims1, _iDims1);
-    for (i = 0 ; i < iSize1 ; i++)
-    {
-        _pdblRealOut[i] = _dblReal2 - _pdblReal1[i];
-        _pdblImgOut[i] = _dblImg2  - _pdblImg1[i];
-    }
-    return 0;
-}
-
-//Matrix - Scalar
-int iSubstractRealScalarToRealMatrix(double _dblReal1, double* _pdblReal2, int* _piDims2, int _iDims2, double* _pdblRealOut)
-{
-    int i = 0;
-    int iSize2 = GetSize(_piDims2, _iDims2);
-    for (i = 0 ; i < iSize2 ; i++)
-    {
-        _pdblRealOut[i] = _pdblReal2[i] - _dblReal1;
-    }
-    return 0;
-}
-
-int iSubstractComplexScalarToRealMatrix(double _dblReal1, double _dblImg1, double* _pdblReal2, int* _piDims2, int _iDims2, double* _pdblRealOut, double* _pdblImgOut)
-{
-    int i = 0;
-    int iSize2 = GetSize(_piDims2, _iDims2);
-    for (i = 0 ; i < iSize2 ; i++)
-    {
-        _pdblRealOut[i] = _pdblReal2[i] - _dblReal1;
-        _pdblImgOut[i] = - _dblImg1;
-    }
-    return 0;
-}
-
-int iSubstractRealScalarToComplexMatrix(double _dblReal1, double* _pdblReal2, double* _pdblImg2, int* _piDims2, int _iDims2, double* _pdblRealOut, double* _pdblImgOut)
-{
-    int i = 0;
-    int iSize2 = GetSize(_piDims2, _iDims2);
-    for (i = 0 ; i < iSize2 ; i++)
-    {
-        _pdblRealOut[i] = _pdblReal2[i] - _dblReal1;
-        _pdblImgOut[i] = _pdblImg2[i];
-    }
-    return 0;
-}
-
-int iSubstractComplexScalarToComplexMatrix(double _dblReal1, double _dblImg1, double* _pdblReal2, double* _pdblImg2, int* _piDims2, int _iDims2, double* _pdblRealOut, double* _pdblImgOut)
-{
-    int i = 0;
-    int iSize2 = GetSize(_piDims2, _iDims2);
-    for (i = 0 ; i < iSize2 ; i++)
-    {
-        _pdblRealOut[i] = _pdblReal2[i] - _dblReal1;
-        _pdblImgOut[i] = _pdblImg2[i] - _dblImg1;
-    }
-    return 0;
-}
-
-
-//Matrix - Matrix
-int iSubstractRealMatrixToRealMatrix(double* _pdblReal1, double* _pdblReal2, int* _piDims, int _iDims, double* _pdblRealOut)
-{
-    int i = 0;
-    int iSize = GetSize(_piDims, _iDims);
-    for (i = 0 ; i < iSize ; i++)
-    {
-        _pdblRealOut[i] = _pdblReal2[i] - _pdblReal1[i];
-    }
-    return 0;
-}
-
-int iSubstractComplexMatrixToRealMatrix(double* _pdblReal1, double* _pdblImg1, double* _pdblReal2, int* _piDims, int _iDims, double* _pdblRealOut, double* _pdblImgOut)
-{
-    int i = 0;
-    int iSize = GetSize(_piDims, _iDims);
-    for (i = 0 ; i < iSize ; i++)
-    {
-        _pdblRealOut[i] = _pdblReal2[i] - _pdblReal1[i];
-        _pdblImgOut[i] = - _pdblImg1[i];
-    }
-    return 0;
-}
-
-int iSubstractRealMatrixToComplexMatrix(double* _pdblReal1, double* _pdblReal2, double* _pdblImg2, int* _piDims, int _iDims, double* _pdblRealOut, double* _pdblImgOut)
-{
-    int i = 0;
-    int iSize = GetSize(_piDims, _iDims);
-    for (i = 0 ; i < iSize ; i++)
-    {
-        _pdblRealOut[i] = _pdblReal2[i] - _pdblReal1[i];
-        _pdblImgOut[i] = _pdblImg2[i];
-    }
-    return 0;
-}
-
-int iSubstractComplexMatrixToComplexMatrix(double* _pdblReal1, double* _pdblImg1, double* _pdblReal2, double* _pdblImg2, int* _piDims, int _iDims, double* _pdblRealOut, double* _pdblImgOut)
-{
-    int i = 0;
-    int iSize = GetSize(_piDims, _iDims);
-    for (i = 0 ; i < iSize ; i++)
-    {
-        _pdblRealOut[i] = _pdblReal2[i] - _pdblReal1[i];
-        _pdblImgOut[i] = _pdblImg2[i] - _pdblImg1[i];
-    }
-    return 0;
-}
-
-
index b9cccf8..48f51e8 100644 (file)
@@ -17,64 +17,64 @@ extern "C"
 }
 
 //D +
-void add_ll_D_D(double* l, long long size, double* r, double* o)
+void add_ll_D_D(double* l, size_t size, double* r, double* o)
 {
     add(l, size, r, o);
 }
 
-void add_ll_D_DC(double* l, long long size, double* r, double* rc, double* o, double* oc)
+void add_ll_D_DC(double* l, size_t size, double* r, double* rc, double* o, double* oc)
 {
     add(l, size, r, rc, o, oc);
 }
 
-void add_ll_D_D1(double* l, long long size, double r, double* o)
+void add_ll_D_D1(double* l, size_t size, double r, double* o)
 {
     add(l, size, r, o);
 }
 
-void add_ll_D_D1C(double* l, long long size, double r, double rc, double* o, double* oc)
+void add_ll_D_D1C(double* l, size_t size, double r, double rc, double* o, double* oc)
 {
     add(l, size, r, rc, o, oc);
 }
 
-void add_ll_D_E(double* l, long long size, double* o)
+void add_ll_D_E(double* l, size_t size, double* o)
 {
     add(l, size, o);
 }
 
 //DC +
-void add_ll_DC_D(double* l, double* lc, long long size, double* r, double* o, double* oc)
+void add_ll_DC_D(double* l, double* lc, size_t size, double* r, double* o, double* oc)
 {
     add(l, lc, size, r, o, oc);
 }
 
-void add_ll_DC_DC(double* l, double* lc, long long size, double* r, double* rc, double* o, double* oc)
+void add_ll_DC_DC(double* l, double* lc, size_t size, double* r, double* rc, double* o, double* oc)
 {
     add(l, lc, size, r , rc, o, oc);
 }
 
-void add_ll_DC_D1(double* l, double* lc, long long size, double r, double* o, double* oc)
+void add_ll_DC_D1(double* l, double* lc, size_t size, double r, double* o, double* oc)
 {
     add(l, lc, size, r, o, oc);
 }
 
-void add_ll_DC_D1C(double* l, double* lc, long long size, double r, double rc, double* o, double* oc)
+void add_ll_DC_D1C(double* l, double* lc, size_t size, double r, double rc, double* o, double* oc)
 {
     add(l, lc, size, r, rc, o, oc);
 }
 
-void add_ll_DC_E(double* l, double* lc, long long size, double* o, double* oc)
+void add_ll_DC_E(double* l, double* lc, size_t size, double* o, double* oc)
 {
     add(l, lc, size, o, oc);
 }
 
 //D1 +
-void add_ll_D1_D(double l, long long size, double* r, double* o)
+void add_ll_D1_D(double l, size_t size, double* r, double* o)
 {
     add(l, size, r, o);
 }
 
-void add_ll_D1_DC(double l, long long size, double* r, double* rc, double* o, double* oc)
+void add_ll_D1_DC(double l, size_t size, double* r, double* rc, double* o, double* oc)
 {
     add(l, size, r, rc, o, oc);
 }
@@ -95,12 +95,12 @@ void add_ll_D1_E(double l, double* o)
 }
 
 //D1C +
-void add_ll_D1C_D(double l, double lc, long long size, double* r, double* o, double* oc)
+void add_ll_D1C_D(double l, double lc, size_t size, double* r, double* o, double* oc)
 {
     add(l, lc, size, r, o, oc);
 }
 
-void add_ll_D1C_DC(double l, double lc, long long size, double* r, double* rc, double* o, double* oc)
+void add_ll_D1C_DC(double l, double lc, size_t size, double* r, double* rc, double* o, double* oc)
 {
     add(l, lc, size, r, rc, o, oc);
 }
@@ -121,12 +121,12 @@ void add_ll_D1C_E(double l, double lc, double* o, double* oc)
 }
 
 //E +
-void add_ll_E_D(double* r, long long size, double* o)
+void add_ll_E_D(double* r, size_t size, double* o)
 {
     add(r, size, o);
 }
 
-void add_ll_E_DC(double* r, double* rc, long long size, double* o, double* oc)
+void add_ll_E_DC(double* r, double* rc, size_t size, double* o, double* oc)
 {
     add(r, rc, size, o, oc);
 }
index 95f3060..b14b1de 100644 (file)
@@ -5,10 +5,12 @@
 #include "types_addition.hxx"
 #include "types_subtraction.hxx"
 #include "types_opposite.hxx"
+#include "types_dotmultiplication.hxx"
 
 void initOperationArray()
 {
     fillAddFunction();
     fillOppositeFunction();
     fillSubtractFunction();
+    fillDotMulFunction();
 }
index dade513..2a3bc24 100644 (file)
@@ -156,11 +156,11 @@ void fillAddFunction()
     scilab_fill_add(Empty, UInt8, E_M, Double, UInt8, UInt8);
     scilab_fill_add(Empty, Int16, E_M, Double, Int16, Int16);
     scilab_fill_add(Empty, UInt16, E_M, Double, UInt16, UInt16);
-    //scilab_fill_add(Empty, Int32, E_M, Double, Int32, Int32);
+    scilab_fill_add(Empty, Int32, E_M, Double, Int32, Int32);
     scilab_fill_add(Empty, UInt32, E_M, Double, UInt32, UInt32);
     scilab_fill_add(Empty, Int64, E_M, Double, Int64, Int64);
     scilab_fill_add(Empty, UInt64, E_M, Double, UInt64, UInt64);
-    //scilab_fill_add(Empty, Bool, E_M, Double, Bool, Double);
+    scilab_fill_add(Empty, Bool, E_M, Double, Bool, Double);
     scilab_fill_add(Empty, String, E_M, Double, String, String);
     scilab_fill_add(Empty, Polynom, M_M, Double, Polynom, Polynom);
     scilab_fill_add(Empty, PolynomComplex, M_M, Double, Polynom, Polynom);
@@ -215,7 +215,7 @@ void fillAddFunction()
     scilab_fill_add(Int8, Int64, M_M, Int8, Int64, Int64);
     scilab_fill_add(Int8, UInt64, M_M, Int8, UInt64, UInt64);
     scilab_fill_add(Int8, Bool, M_M, Int8, Bool, Int8);
-    scilab_fill_add(Int8, Empty, M_M, Int8, Double, Int8);
+    scilab_fill_add(Int8, Empty, M_E, Int8, Double, Int8);
 
     //Matrix + Scalar
     scilab_fill_add(Int8, ScalarDouble, M_S, Int8, Double, Int8);
@@ -240,7 +240,7 @@ void fillAddFunction()
     scilab_fill_add(ScalarInt8, Int64, S_M, Int8, Int64, Int64);
     scilab_fill_add(ScalarInt8, UInt64, S_M, Int8, UInt64, UInt64);
     scilab_fill_add(ScalarInt8, Bool, S_M, Int8, Bool, Int8);
-    scilab_fill_add(ScalarInt8, Empty, M_M, Int8, Double, Int8);
+    scilab_fill_add(ScalarInt8, Empty, S_E, Int8, Double, Int8);
 
     //Scalar + Scalar
     scilab_fill_add(ScalarInt8, ScalarDouble, S_S, Int8, Double, Int8);
@@ -266,7 +266,7 @@ void fillAddFunction()
     scilab_fill_add(UInt8, Int64, M_M, UInt8, Int64, UInt64);
     scilab_fill_add(UInt8, UInt64, M_M, UInt8, UInt64, UInt64);
     scilab_fill_add(UInt8, Bool, M_M, UInt8, Bool, UInt8);
-    scilab_fill_add(UInt8, Empty, M_M, UInt8, Double, UInt8);
+    scilab_fill_add(UInt8, Empty, M_E, UInt8, Double, UInt8);
 
     //Matrix + Scalar
     scilab_fill_add(UInt8, ScalarDouble, M_S, UInt8, Double, UInt8);
@@ -291,7 +291,7 @@ void fillAddFunction()
     scilab_fill_add(ScalarUInt8, Int64, S_M, UInt8, Int64, UInt64);
     scilab_fill_add(ScalarUInt8, UInt64, S_M, UInt8, UInt64, UInt64);
     scilab_fill_add(ScalarUInt8, Bool, S_M, UInt8, Bool, UInt8);
-    scilab_fill_add(ScalarUInt8, Empty, S_M, UInt8, Double, UInt8);
+    scilab_fill_add(ScalarUInt8, Empty, S_E, UInt8, Double, UInt8);
 
     //Scalar + Scalar
     scilab_fill_add(ScalarUInt8, ScalarDouble, S_S, UInt8, Double, UInt8);
@@ -317,7 +317,7 @@ void fillAddFunction()
     scilab_fill_add(Int16, Int64, M_M, Int16, Int64, Int64);
     scilab_fill_add(Int16, UInt64, M_M, Int16, UInt64, UInt64);
     scilab_fill_add(Int16, Bool, M_M, Int16, Bool, Int16);
-    scilab_fill_add(Int16, Empty, M_M, Int16, Double, Int16);
+    scilab_fill_add(Int16, Empty, M_E, Int16, Double, Int16);
 
     //Matrix + Scalar
     scilab_fill_add(Int16, ScalarDouble, M_S, Int16, Double, Int16);
@@ -342,7 +342,7 @@ void fillAddFunction()
     scilab_fill_add(ScalarInt16, Int64, S_M, Int16, Int64, Int64);
     scilab_fill_add(ScalarInt16, UInt64, S_M, Int16, UInt64, UInt64);
     scilab_fill_add(ScalarInt16, Bool, S_M, Int16, Bool, Int16);
-    scilab_fill_add(ScalarInt16, Empty, M_M, Int16, Double, Int16);
+    scilab_fill_add(ScalarInt16, Empty, S_E, Int16, Double, Int16);
 
     //Scalar + Scalar
     scilab_fill_add(ScalarInt16, ScalarDouble, S_S, Int16, Double, Int16);
@@ -368,7 +368,7 @@ void fillAddFunction()
     scilab_fill_add(UInt16, Int64, M_M, UInt16, Int64, UInt64);
     scilab_fill_add(UInt16, UInt64, M_M, UInt16, UInt64, UInt64);
     scilab_fill_add(UInt16, Bool, M_M, UInt16, Bool, UInt16);
-    scilab_fill_add(UInt16, Empty, M_M, UInt16, Double, UInt16);
+    scilab_fill_add(UInt16, Empty, M_E, UInt16, Double, UInt16);
 
     //Matrix + Scalar
     scilab_fill_add(UInt16, ScalarDouble, M_S, UInt16, Double, UInt16);
@@ -393,7 +393,7 @@ void fillAddFunction()
     scilab_fill_add(ScalarUInt16, Int64, S_M, UInt16, Int64, UInt64);
     scilab_fill_add(ScalarUInt16, UInt64, S_M, UInt16, UInt64, UInt64);
     scilab_fill_add(ScalarUInt16, Bool, S_M, UInt16, Bool, UInt16);
-    scilab_fill_add(ScalarUInt16, Empty, S_M, UInt16, Double, UInt16);
+    scilab_fill_add(ScalarUInt16, Empty, S_E, UInt16, Double, UInt16);
 
     //Scalar + Scalar
     scilab_fill_add(ScalarUInt16, ScalarDouble, S_S, UInt16, Double, UInt16);
@@ -419,7 +419,7 @@ void fillAddFunction()
     scilab_fill_add(Int32, Int64, M_M, Int32, Int64, Int64);
     scilab_fill_add(Int32, UInt64, M_M, Int32, UInt64, UInt64);
     scilab_fill_add(Int32, Bool, M_M, Int32, Bool, Int32);
-    scilab_fill_add(Int32, Empty, M_M, Int32, Double, Int32);
+    scilab_fill_add(Int32, Empty, M_E, Int32, Double, Int32);
 
     //Matrix + Scalar
     scilab_fill_add(Int32, ScalarDouble, M_S, Int32, Double, Int32);
@@ -444,7 +444,7 @@ void fillAddFunction()
     scilab_fill_add(ScalarInt32, Int64, S_M, Int32, Int64, Int64);
     scilab_fill_add(ScalarInt32, UInt64, S_M, Int32, UInt64, UInt64);
     scilab_fill_add(ScalarInt32, Bool, S_M, Int32, Bool, Int32);
-    scilab_fill_add(ScalarInt32, Empty, M_M, Int32, Double, Int32);
+    scilab_fill_add(ScalarInt32, Empty, S_E, Int32, Double, Int32);
 
     //Scalar + Scalar
     scilab_fill_add(ScalarInt32, ScalarDouble, S_S, Int32, Double, Int32);
@@ -470,7 +470,7 @@ void fillAddFunction()
     scilab_fill_add(UInt32, Int64, M_M, UInt32, Int64, UInt64);
     scilab_fill_add(UInt32, UInt64, M_M, UInt32, UInt64, UInt64);
     scilab_fill_add(UInt32, Bool, M_M, UInt32, Bool, UInt32);
-    scilab_fill_add(UInt32, Empty, M_M, UInt32, Double, UInt32);
+    scilab_fill_add(UInt32, Empty, M_E, UInt32, Double, UInt32);
 
     //Matrix + Scalar
     scilab_fill_add(UInt32, ScalarDouble, M_S, UInt32, Double, UInt32);
@@ -495,7 +495,7 @@ void fillAddFunction()
     scilab_fill_add(ScalarUInt32, Int64, S_M, UInt32, Int64, UInt64);
     scilab_fill_add(ScalarUInt32, UInt64, S_M, UInt32, UInt64, UInt64);
     scilab_fill_add(ScalarUInt32, Bool, S_M, UInt32, Bool, UInt32);
-    scilab_fill_add(ScalarUInt32, Empty, S_M, UInt32, Double, UInt32);
+    scilab_fill_add(ScalarUInt32, Empty, S_E, UInt32, Double, UInt32);
 
     //Scalar + Scalar
     scilab_fill_add(ScalarUInt32, ScalarDouble, S_S, UInt32, Double, UInt32);
@@ -521,7 +521,7 @@ void fillAddFunction()
     scilab_fill_add(Int64, Int64, M_M, Int64, Int64, Int64);
     scilab_fill_add(Int64, UInt64, M_M, Int64, UInt64, UInt64);
     scilab_fill_add(Int64, Bool, M_M, Int64, Bool, Int64);
-    scilab_fill_add(Int64, Empty, M_M, Int64, Double, Int64);
+    scilab_fill_add(Int64, Empty, M_E, Int64, Double, Int64);
 
     //Matrix + Scalar
     scilab_fill_add(Int64, ScalarDouble, M_S, Int64, Double, Int64);
@@ -546,7 +546,7 @@ void fillAddFunction()
     scilab_fill_add(ScalarInt64, Int64, S_M, Int64, Int64, Int64);
     scilab_fill_add(ScalarInt64, UInt64, S_M, Int64, UInt64, UInt64);
     scilab_fill_add(ScalarInt64, Bool, S_M, Int64, Bool, Int64);
-    scilab_fill_add(ScalarInt64, Empty, M_M, Int64, Double, Int64);
+    scilab_fill_add(ScalarInt64, Empty, S_E, Int64, Double, Int64);
 
     //Scalar + Scalar
     scilab_fill_add(ScalarInt64, ScalarDouble, S_S, Int64, Double, Int64);
@@ -572,7 +572,7 @@ void fillAddFunction()
     scilab_fill_add(UInt64, Int64, M_M, UInt64, Int64, UInt64);
     scilab_fill_add(UInt64, UInt64, M_M, UInt64, UInt64, UInt64);
     scilab_fill_add(UInt64, Bool, M_M, UInt64, Bool, UInt64);
-    scilab_fill_add(UInt64, Empty, M_M, UInt64, Double, UInt64);
+    scilab_fill_add(UInt64, Empty, M_E, UInt64, Double, UInt64);
 
     //Matrix + Scalar
     scilab_fill_add(UInt64, ScalarDouble, M_S, UInt64, Double, UInt64);
@@ -597,7 +597,7 @@ void fillAddFunction()
     scilab_fill_add(ScalarUInt64, Int64, S_M, UInt64, Int64, UInt64);
     scilab_fill_add(ScalarUInt64, UInt64, S_M, UInt64, UInt64, UInt64);
     scilab_fill_add(ScalarUInt64, Bool, S_M, UInt64, Bool, UInt64);
-    scilab_fill_add(ScalarUInt64, Empty, S_M, UInt64, Double, UInt64);
+    scilab_fill_add(ScalarUInt64, Empty, S_E, UInt64, Double, UInt64);
 
     //Scalar + Scalar
     scilab_fill_add(ScalarUInt64, ScalarDouble, S_S, UInt64, Double, UInt64);
@@ -623,7 +623,7 @@ void fillAddFunction()
     scilab_fill_add(Bool, Int64, M_M, Bool, Int64, Int64);
     scilab_fill_add(Bool, UInt64, M_M, Bool, UInt64, UInt64);
     scilab_fill_add(Bool, Bool, M_M, Bool, Bool, Bool);
-    scilab_fill_add(Bool, Empty, M_M, Bool, Double, Double);
+    scilab_fill_add(Bool, Empty, M_E, Bool, Double, Double);
 
     //Matrix + Scalar
     scilab_fill_add(Bool, ScalarDouble, M_S, Bool, Double, Double);
@@ -648,7 +648,7 @@ void fillAddFunction()
     scilab_fill_add(ScalarBool, Int64, S_M, Bool, Int64, Int64);
     scilab_fill_add(ScalarBool, UInt64, S_M, Bool, UInt64, UInt64);
     scilab_fill_add(ScalarBool, Bool, S_M, Bool, Bool, Bool);
-    scilab_fill_add(ScalarBool, Empty, M_M, Bool, Double, Double);
+    scilab_fill_add(ScalarBool, Empty, S_E, Bool, Double, Double);
 
     //Scalar + Scalar
     scilab_fill_add(ScalarBool, ScalarDouble, S_S, Bool, Double, Double);
@@ -680,10 +680,10 @@ void fillAddFunction()
     scilab_fill_add(Identity, IdentityComplex, I_IC, Double, Double, Double);
     scilab_fill_add(Identity, Empty, I_E, Double, Double, Double);
 
-    scilab_fill_add(Identity, Polynom, M_M, Double, Polynom, Polynom);
-    scilab_fill_add(Identity, PolynomComplex, M_M, Double, Polynom, Polynom);
-    scilab_fill_add(Identity, ScalarPolynom, M_M, Double, Polynom, Polynom);
-    scilab_fill_add(Identity, ScalarPolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_add(Identity, Polynom, I_M, Double, Polynom, Polynom);
+    scilab_fill_add(Identity, PolynomComplex, I_M, Double, Polynom, Polynom);
+    scilab_fill_add(Identity, ScalarPolynom, I_M, Double, Polynom, Polynom);
+    scilab_fill_add(Identity, ScalarPolynomComplex, I_M, Double, Polynom, Polynom);
     scilab_fill_add(Identity, Sparse, M_M, Double, Sparse, Sparse);
     scilab_fill_add(Identity, SparseComplex, M_M, Double, Sparse, Sparse);
 
@@ -695,10 +695,10 @@ void fillAddFunction()
     scilab_fill_add(IdentityComplex, IdentityComplex, IC_IC, Double, Double, Double);
     scilab_fill_add(IdentityComplex, Empty, IC_E, Double, Double, Double);
 
-    scilab_fill_add(IdentityComplex, Polynom, M_M, Double, Polynom, Polynom);
-    scilab_fill_add(IdentityComplex, PolynomComplex, M_M, Double, Polynom, Polynom);
-    scilab_fill_add(IdentityComplex, ScalarPolynom, M_M, Double, Polynom, Polynom);
-    scilab_fill_add(IdentityComplex, ScalarPolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_add(IdentityComplex, Polynom, I_M, Double, Polynom, Polynom);
+    scilab_fill_add(IdentityComplex, PolynomComplex, I_M, Double, Polynom, Polynom);
+    scilab_fill_add(IdentityComplex, ScalarPolynom, I_M, Double, Polynom, Polynom);
+    scilab_fill_add(IdentityComplex, ScalarPolynomComplex, I_M, Double, Polynom, Polynom);
     scilab_fill_add(IdentityComplex, Sparse, M_M, Double, Sparse, Sparse);
     scilab_fill_add(IdentityComplex, SparseComplex, M_M, Double, Sparse, Sparse);
 
@@ -733,10 +733,10 @@ void fillAddFunction()
     scilab_fill_add(PolynomComplex, Empty, M_M, Polynom, Double, Polynom);
 
     //poly + eye
-    scilab_fill_add(Polynom, Identity, M_M, Polynom, Double, Polynom);
-    scilab_fill_add(Polynom, IdentityComplex, M_M, Polynom, Double, Polynom);
-    scilab_fill_add(PolynomComplex, Identity, M_M, Polynom, Double, Polynom);
-    scilab_fill_add(PolynomComplex, IdentityComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_add(Polynom, Identity, M_I, Polynom, Double, Polynom);
+    scilab_fill_add(Polynom, IdentityComplex, M_I, Polynom, Double, Polynom);
+    scilab_fill_add(PolynomComplex, Identity, M_I, Polynom, Double, Polynom);
+    scilab_fill_add(PolynomComplex, IdentityComplex, M_I, Polynom, Double, Polynom);
 
     //scalar poly + poly
     scilab_fill_add(ScalarPolynom, Polynom, M_M, Polynom, Polynom, Polynom);
@@ -767,10 +767,10 @@ void fillAddFunction()
     scilab_fill_add(ScalarPolynomComplex, Empty, M_M, Polynom, Double, Polynom);
 
     //scalar poly + eye
-    scilab_fill_add(ScalarPolynom, Identity, M_M, Polynom, Double, Polynom);
-    scilab_fill_add(ScalarPolynom, IdentityComplex, M_M, Polynom, Double, Polynom);
-    scilab_fill_add(ScalarPolynomComplex, Identity, M_M, Polynom, Double, Polynom);
-    scilab_fill_add(ScalarPolynomComplex, IdentityComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_add(ScalarPolynom, Identity, M_I, Polynom, Double, Polynom);
+    scilab_fill_add(ScalarPolynom, IdentityComplex, M_I, Polynom, Double, Polynom);
+    scilab_fill_add(ScalarPolynomComplex, Identity, M_I, Polynom, Double, Polynom);
+    scilab_fill_add(ScalarPolynomComplex, IdentityComplex, M_I, Polynom, Double, Polynom);
 
     //Sparse
     scilab_fill_add(Sparse, Sparse, M_M, Sparse, Sparse, Sparse);
@@ -1087,7 +1087,7 @@ InternalType* add_M_M(T *_pL, U *_pR)
 
     O* pOut = new O(iDimsL, piDimsL);
 
-    add(_pL->get(), (long long)_pL->getSize(), _pR->get(), pOut->get());
+    add(_pL->get(), (size_t)_pL->getSize(), _pR->get(), pOut->get());
     return pOut;
 }
 
@@ -1115,7 +1115,7 @@ InternalType* add_M_MC(T *_pL, U *_pR)
 
     O* pOut = new O(iDimsL, piDimsL, true);
 
-    add(_pL->get(), (long long)_pL->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
+    add(_pL->get(), (size_t)_pL->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -1123,7 +1123,7 @@ template<class T, class U, class O>
 InternalType* add_M_S(T *_pL, U *_pR)
 {
     O* pOut = new O(_pL->getDims(), _pL->getDimsArray());
-    add(_pL->get(), (long long)_pL->getSize(), _pR->get(0), pOut->get());
+    add(_pL->get(), (size_t)_pL->getSize(), _pR->get(0), pOut->get());
     return pOut;
 }
 
@@ -1131,7 +1131,7 @@ template<class T, class U, class O>
 InternalType* add_M_SC(T *_pL, U *_pR)
 {
     O* pOut = new O(_pL->getDims(), _pL->getDimsArray(), true);
-    add(_pL->get(), (long long)_pL->getSize(), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    add(_pL->get(), (size_t)_pL->getSize(), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -1172,7 +1172,7 @@ InternalType* add_MC_MC(T *_pL, U *_pR)
 
     O* pOut = new O(iDimsL, piDimsL, true);
 
-    add(_pL->get(), _pL->getImg(), (long long)_pL->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
+    add(_pL->get(), _pL->getImg(), (size_t)_pL->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -1180,7 +1180,7 @@ template<class T, class U, class O>
 InternalType* add_MC_S(T *_pL, U *_pR)
 {
     O* pOut = new O(_pL->getDims(), _pL->getDimsArray(), true);
-    add(_pL->get(), _pL->getImg(), (long long)_pL->getSize(), _pR->get(0), pOut->get(), pOut->getImg());
+    add(_pL->get(), _pL->getImg(), (size_t)_pL->getSize(), _pR->get(0), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -1188,7 +1188,7 @@ template<class T, class U, class O>
 InternalType* add_MC_SC(T *_pL, U *_pR)
 {
     O* pOut = new O(_pL->getDims(), _pL->getDimsArray(), true);
-    add(_pL->get(), _pL->getImg(), (long long)_pL->getSize(), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    add(_pL->get(), _pL->getImg(), (size_t)_pL->getSize(), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -1196,7 +1196,7 @@ template<class T, class U, class O>
 InternalType* add_MC_E(T *_pL, U *_pR)
 {
     O* pOut = new O(_pL->getDims(), _pL->getDimsArray(), true);
-    add(_pL->get(), _pL->getImg(), (long long)_pL->getSize(), pOut->get(), pOut->getImg());
+    add(_pL->get(), _pL->getImg(), (size_t)_pL->getSize(), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -2102,6 +2102,78 @@ template<> InternalType* add_M_M<Double, Polynom, Polynom>(Double* _pL, Polynom*
     return pOut;
 }
 
+//poly + eye
+template<> InternalType* add_M_I<Polynom, Double, Polynom>(Polynom* _pL, Double* _pR)
+{
+    Polynom* pOut = (Polynom*)_pL->clone();
+    bool isComplex = _pL->isComplex() || _pR->isComplex();
+    pOut->setComplex(isComplex);
+
+    int iDims = _pL->getDims();
+    int* piDims = _pL->getDimsArray();
+    int iLeadDims = piDims[0];
+    int* piIndex = new int[iDims];
+    piIndex[0] = 0;
+
+    //find smaller dims
+    for (int i = 1 ; i < iDims ; ++i)
+    {
+        //init
+        piIndex[i] = 0;
+
+        if (iLeadDims > piDims[i])
+        {
+            iLeadDims = piDims[i];
+        }
+    }
+
+    double dblR = _pR->get(0);
+
+    if (isComplex)
+    {
+        int iSize = pOut->getSize();
+        SinglePoly** pSP = pOut->get();
+
+        double dblI = 0;
+        if (_pR->isComplex())
+        {
+            dblI = _pR->getImg(0);
+        }
+
+        for (int i = 0 ; i < iLeadDims ; ++i)
+        {
+            for (int j = 0 ; j < iDims ; ++j)
+            {
+                piIndex[j] = i;
+            }
+
+            int index = _pL->getIndex(piIndex);
+            add(dblR, dblI, pSP[index]->get(0), pSP[index]->getImg(0), pSP[index]->get(), pSP[index]->getImg());
+        }
+    }
+    else
+    {
+        int iSize = pOut->getSize();
+        SinglePoly** pSP = pOut->get();
+        for (int i = 0 ; i < iLeadDims ; ++i)
+        {
+            for (int j = 0 ; j < iDims ; ++j)
+            {
+                piIndex[j] = i;
+            }
+
+            int index = _pL->getIndex(piIndex);
+            add(dblR, pSP[index]->get(0), pSP[index]->get());
+        }
+    }
+    return pOut;
+}
+
+template<> InternalType* add_I_M<Double, Polynom, Polynom>(Double* _pL, Polynom* _pR)
+{
+    return add_M_I<Polynom, Double, Polynom>(_pR, _pL);
+}
+
 //sp + sp
 template<> InternalType* add_M_M<Sparse, Sparse, Sparse>(Sparse* _pL, Sparse* _pR)
 {
@@ -2337,26 +2409,38 @@ template<> InternalType* add_M_M<Sparse, Double, Sparse>(Sparse* _pL, Double* _p
     if (_pR->isIdentity())
     {
         //convert to _pL
-        Sparse* pS = new Sparse(_pL->getRows(), _pL->getCols(), _pR->isComplex());
-        if (pS->isComplex())
+        pOut = (Sparse*)_pL->clone();
+        bool isComplex = _pL->isComplex() || _pR->isComplex();
+        if (isComplex)
         {
-            int size = std::min(_pL->getRows(), _pL->getCols());
+            pOut->toComplex();
+        }
+
+        int size = std::min(_pL->getRows(), _pL->getCols());
+        double dblR = _pR->get(0);
+
+        if (isComplex)
+        {
+            std::complex<double> cplx_add(dblR, 0);
+            if (_pR->isComplex())
+            {
+                cplx_add.imag(_pR->getImg(0));
+            }
+
             for (int i = 0 ; i < size ; i++)
             {
-                pS->set(i, i, std::complex<double>(_pR->get(0), _pR->getImg(0)));
+                pOut->set(i, i, pOut->get(i, i) + cplx_add, false);
             }
         }
         else
         {
-            int size = std::min(_pL->getRows(), _pL->getCols());
             for (int i = 0 ; i < size ; i++)
             {
-                pS->set(i, i, _pR->get(0));
+                pOut->set(i, i, _pL->get(i, i) + dblR, false);
             }
         }
 
-        AddSparseToSparse(_pL, pS, (Sparse**)pOut);
-        delete pS;
+        pOut->finalize();
         return pOut;
     }
     else
diff --git a/scilab/modules/ast/src/cpp/operations/types_dotmultiplication.cpp b/scilab/modules/ast/src/cpp/operations/types_dotmultiplication.cpp
new file mode 100644 (file)
index 0000000..4433b6d
--- /dev/null
@@ -0,0 +1,1657 @@
+/*
+ *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+ *  Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
+ *
+ *  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
+ *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+ *
+ */
+
+#include "types_dotmultiplication.hxx"
+#include "scilabexception.hxx"
+#include "double.hxx"
+#include "int.hxx"
+#include "sparse.hxx"
+#include "polynom.hxx"
+
+
+extern "C"
+{
+#include "localization.h"
+}
+
+
+using namespace types;
+//define arrays on operation functions
+static dotmul_function pDotMulfunction[types::InternalType::IdLast][types::InternalType::IdLast] = {NULL};
+
+void fillDotMulFunction()
+{
+#define scilab_fill_dotmul(id1, id2, func, typeIn1, typeIn2, typeOut) \
+    pDotMulfunction[types::InternalType::Id ## id1][types::InternalType::Id ## id2] = (dotmul_function)&dotmul_##func<typeIn1, typeIn2, typeOut>
+
+    //Double
+    //Matrix .* Matrix
+    scilab_fill_dotmul(Double, Double, M_M, Double, Double, Double);
+    scilab_fill_dotmul(Double, Int8, M_M, Double, Int8, Int8);
+    scilab_fill_dotmul(Double, UInt8, M_M, Double, UInt8, UInt8);
+    scilab_fill_dotmul(Double, Int16, M_M, Double, Int16, Int16);
+    scilab_fill_dotmul(Double, UInt16, M_M, Double, UInt16, UInt16);
+    scilab_fill_dotmul(Double, Int32, M_M, Double, Int32, Int32);
+    scilab_fill_dotmul(Double, UInt32, M_M, Double, UInt32, UInt32);
+    scilab_fill_dotmul(Double, Int64, M_M, Double, Int64, Int64);
+    scilab_fill_dotmul(Double, UInt64, M_M, Double, UInt64, UInt64);
+    scilab_fill_dotmul(Double, Bool, M_M, Double, Bool, Double);
+    scilab_fill_dotmul(Double, Polynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(Double, Sparse, M_M, Double, Sparse, Sparse);
+
+    //Matrix .* Matrix Complex
+    scilab_fill_dotmul(Double, DoubleComplex, M_MC, Double, Double, Double);
+    scilab_fill_dotmul(Double, PolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(Double, SparseComplex, M_M, Double, Sparse, Sparse);
+
+    //Matrix .* Scalar
+    scilab_fill_dotmul(Double, ScalarDouble, M_S, Double, Double, Double);
+    scilab_fill_dotmul(Double, ScalarInt8, M_S, Double, Int8, Int8);
+    scilab_fill_dotmul(Double, ScalarUInt8, M_S, Double, UInt8, UInt8);
+    scilab_fill_dotmul(Double, ScalarInt16, M_S, Double, Int16, Int16);
+    scilab_fill_dotmul(Double, ScalarUInt16, M_S, Double, UInt16, UInt16);
+    scilab_fill_dotmul(Double, ScalarInt32, M_S, Double, Int32, Int32);
+    scilab_fill_dotmul(Double, ScalarUInt32, M_S, Double, UInt32, UInt32);
+    scilab_fill_dotmul(Double, ScalarInt64, M_S, Double, Int64, Int64);
+    scilab_fill_dotmul(Double, ScalarUInt64, M_S, Double, UInt64, UInt64);
+    scilab_fill_dotmul(Double, ScalarBool, M_S, Double, Bool, Double);
+    scilab_fill_dotmul(Double, ScalarPolynom, M_M, Double, Polynom, Polynom);
+
+    //Matrix .* Scalar Complex
+    scilab_fill_dotmul(Double, ScalarDoubleComplex, M_SC, Double, Double, Double);
+    scilab_fill_dotmul(Double, ScalarPolynomComplex, M_M, Double, Polynom, Polynom);
+    //Matrix .* Empty
+    scilab_fill_dotmul(Double, Empty, M_E, Double, Double, Double);
+
+
+    //Matrix Complex .* Matrix
+    scilab_fill_dotmul(DoubleComplex, Double, MC_M, Double, Double, Double);
+    scilab_fill_dotmul(DoubleComplex, DoubleComplex, MC_MC, Double, Double, Double);
+    scilab_fill_dotmul(DoubleComplex, ScalarDouble, MC_S, Double, Double, Double);
+    scilab_fill_dotmul(DoubleComplex, ScalarDoubleComplex, MC_SC, Double, Double, Double);
+    scilab_fill_dotmul(DoubleComplex, Empty, M_E, Double, Double, Double);
+    scilab_fill_dotmul(DoubleComplex, Polynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(DoubleComplex, PolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(DoubleComplex, ScalarPolynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(DoubleComplex, ScalarPolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(DoubleComplex, Sparse, M_M, Double, Sparse, Sparse);
+    scilab_fill_dotmul(DoubleComplex, SparseComplex, M_M, Double, Sparse, Sparse);
+
+    //Scalar .* Matrix
+    scilab_fill_dotmul(ScalarDouble, Double, S_M, Double, Double, Double);
+    scilab_fill_dotmul(ScalarDouble, Int8, S_M, Double, Int8, Int8);
+    scilab_fill_dotmul(ScalarDouble, UInt8, S_M, Double, UInt8, UInt8);
+    scilab_fill_dotmul(ScalarDouble, Int16, S_M, Double, Int16, Int16);
+    scilab_fill_dotmul(ScalarDouble, UInt16, S_M, Double, UInt16, UInt16);
+    scilab_fill_dotmul(ScalarDouble, Int32, S_M, Double, Int32, Int32);
+    scilab_fill_dotmul(ScalarDouble, UInt32, S_M, Double, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarDouble, Int64, S_M, Double, Int64, Int64);
+    scilab_fill_dotmul(ScalarDouble, UInt64, S_M, Double, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarDouble, Bool, S_M, Double, Bool, Double);
+    scilab_fill_dotmul(ScalarDouble, Polynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(ScalarDouble, Sparse, M_M, Double, Sparse, Sparse);
+
+    //Scalar .* Matrix Complex
+    scilab_fill_dotmul(ScalarDouble, DoubleComplex, S_MC, Double, Double, Double);
+    scilab_fill_dotmul(ScalarDouble, PolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(ScalarDouble, SparseComplex, M_M, Double, Sparse, Sparse);
+
+    //Scalar .* Scalar
+    scilab_fill_dotmul(ScalarDouble, ScalarDouble, S_S, Double, Double, Double);
+    scilab_fill_dotmul(ScalarDouble, ScalarInt8, S_S, Double, Int8, Int8);
+    scilab_fill_dotmul(ScalarDouble, ScalarUInt8, S_S, Double, UInt8, UInt8);
+    scilab_fill_dotmul(ScalarDouble, ScalarInt16, S_S, Double, Int16, Int16);
+    scilab_fill_dotmul(ScalarDouble, ScalarUInt16, S_S, Double, UInt16, UInt16);
+    scilab_fill_dotmul(ScalarDouble, ScalarInt32, S_S, Double, Int32, Int32);
+    scilab_fill_dotmul(ScalarDouble, ScalarUInt32, S_S, Double, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarDouble, ScalarInt64, S_S, Double, Int64, Int64);
+    scilab_fill_dotmul(ScalarDouble, ScalarUInt64, S_S, Double, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarDouble, ScalarBool, S_S, Double, Bool, Double);
+    scilab_fill_dotmul(ScalarDouble, ScalarPolynom, M_M, Double, Polynom, Polynom);
+
+    //Scalar .* Scalar Complex
+    scilab_fill_dotmul(ScalarDouble, ScalarDoubleComplex, S_SC, Double, Double, Double);
+    scilab_fill_dotmul(ScalarDouble, PolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(ScalarDouble, ScalarPolynomComplex, M_M, Double, Polynom, Polynom);
+
+    //Scalar .* Empty
+    scilab_fill_dotmul(ScalarDouble, Empty, M_E, Double, Double, Double);
+
+    //Scalar Complex .* Matrix
+    scilab_fill_dotmul(ScalarDoubleComplex, Double, SC_M, Double, Double, Double);
+    scilab_fill_dotmul(ScalarDoubleComplex, Polynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(ScalarDoubleComplex, Sparse, M_M, Double, Sparse, Sparse);
+    //Scalar Complex .* Matrix Complex
+    scilab_fill_dotmul(ScalarDoubleComplex, DoubleComplex, SC_MC, Double, Double, Double);
+    scilab_fill_dotmul(ScalarDoubleComplex, PolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(ScalarDoubleComplex, SparseComplex, M_M, Double, Sparse, Sparse);
+    //Scalar Complex .* Scalar
+    scilab_fill_dotmul(ScalarDoubleComplex, ScalarDouble, SC_S, Double, Double, Double);
+    scilab_fill_dotmul(ScalarDoubleComplex, ScalarPolynom, M_M, Double, Polynom, Polynom);
+    //Scalar Complex .* Scalar Complex
+    scilab_fill_dotmul(ScalarDoubleComplex, ScalarDoubleComplex, SC_SC, Double, Double, Double);
+    scilab_fill_dotmul(ScalarDoubleComplex, ScalarPolynomComplex, M_M, Double, Polynom, Polynom);
+    //Scalar Complex .* Empty
+    scilab_fill_dotmul(ScalarDoubleComplex, Empty, M_E, Double, Double, Double);
+
+    //Empty .* Matrix
+    scilab_fill_dotmul(Empty, Double, E_M, Double, Double, Double);
+    scilab_fill_dotmul(Empty, Int8, E_M, Double, Int8, Double);
+    scilab_fill_dotmul(Empty, UInt8, E_M, Double, UInt8, Double);
+    scilab_fill_dotmul(Empty, Int16, E_M, Double, Int16, Double);
+    scilab_fill_dotmul(Empty, UInt16, E_M, Double, UInt16, Double);
+    scilab_fill_dotmul(Empty, Int32, E_M, Double, Int32, Double);
+    scilab_fill_dotmul(Empty, UInt32, E_M, Double, UInt32, Double);
+    scilab_fill_dotmul(Empty, Int64, E_M, Double, Int64, Double);
+    scilab_fill_dotmul(Empty, UInt64, E_M, Double, UInt64, Double);
+    scilab_fill_dotmul(Empty, Polynom, E_M, Double, Polynom, Double);
+    scilab_fill_dotmul(Empty, PolynomComplex, E_M, Double, Polynom, Double);
+    scilab_fill_dotmul(Empty, Sparse, E_M, Double, Sparse, Double);
+    scilab_fill_dotmul(Empty, SparseComplex, E_M, Double, Sparse, Double);
+
+    //Empty .* Matrix Complex
+    scilab_fill_dotmul(Empty, DoubleComplex, E_M, Double, Double, Double);
+    //Empty .* Scalar
+    scilab_fill_dotmul(Empty, ScalarDouble, E_M, Double, Double, Double);
+    scilab_fill_dotmul(Empty, ScalarInt8, E_M, Double, Int8, Double);
+    scilab_fill_dotmul(Empty, ScalarUInt8, E_M, Double, UInt8, Double);
+    scilab_fill_dotmul(Empty, ScalarInt16, E_M, Double, Int16, Double);
+    scilab_fill_dotmul(Empty, ScalarUInt16, E_M, Double, UInt16, Double);
+    scilab_fill_dotmul(Empty, ScalarInt32, E_M, Double, Int32, Double);
+    scilab_fill_dotmul(Empty, ScalarUInt32, E_M, Double, UInt32, Double);
+    scilab_fill_dotmul(Empty, ScalarInt64, E_M, Double, Int64, Double);
+    scilab_fill_dotmul(Empty, ScalarUInt64, E_M, Double, UInt64, Double);
+    scilab_fill_dotmul(Empty, ScalarBool, E_M, Double, Bool, Double);
+    scilab_fill_dotmul(Empty, ScalarPolynom, E_M, Double, Polynom, Double);
+
+    //Empty .* Scalar Complex
+    scilab_fill_dotmul(Empty, ScalarDoubleComplex, E_M, Double, Double, Double);
+    scilab_fill_dotmul(Empty, ScalarPolynomComplex, E_M, Double, Polynom, Double);
+    //Empty .* Empty
+    scilab_fill_dotmul(Empty, Empty, E_M, Double, Double, Double);
+    //Empty .* eye
+    scilab_fill_dotmul(Empty, Identity, E_M, Double, Double, Double);
+    scilab_fill_dotmul(Empty, IdentityComplex, E_M, Double, Double, Double);
+
+    //Matrix .* Identity
+    scilab_fill_dotmul(Double, Identity, M_I, Double, Double, Double);
+    scilab_fill_dotmul(Double, IdentityComplex, M_IC, Double, Double, Double);
+    scilab_fill_dotmul(DoubleComplex, Identity, MC_I, Double, Double, Double);
+    scilab_fill_dotmul(DoubleComplex, IdentityComplex, MC_IC, Double, Double, Double);
+    scilab_fill_dotmul(ScalarDouble, Identity, S_I, Double, Double, Double);
+    scilab_fill_dotmul(ScalarDouble, IdentityComplex, S_IC, Double, Double, Double);
+    scilab_fill_dotmul(ScalarDoubleComplex, Identity, SC_I, Double, Double, Double);
+    scilab_fill_dotmul(ScalarDoubleComplex, IdentityComplex, SC_IC, Double, Double, Double);
+
+    //Int8
+    //Matrix .* Matrix
+    scilab_fill_dotmul(Int8, Double, M_M, Int8, Double, Int8);
+    scilab_fill_dotmul(Int8, Int8, M_M, Int8, Int8, Int8);
+    scilab_fill_dotmul(Int8, UInt8, M_M, Int8, UInt8, UInt8);
+    scilab_fill_dotmul(Int8, Int16, M_M, Int8, Int16, Int16);
+    scilab_fill_dotmul(Int8, UInt16, M_M, Int8, UInt16, UInt16);
+    scilab_fill_dotmul(Int8, Int32, M_M, Int8, Int32, Int32);
+    scilab_fill_dotmul(Int8, UInt32, M_M, Int8, UInt32, UInt32);
+    scilab_fill_dotmul(Int8, Int64, M_M, Int8, Int64, Int64);
+    scilab_fill_dotmul(Int8, UInt64, M_M, Int8, UInt64, UInt64);
+    scilab_fill_dotmul(Int8, Bool, M_M, Int8, Bool, Int8);
+    scilab_fill_dotmul(Int8, Empty, M_E, Int8, Double, Double);
+
+    //Matrix .* Scalar
+    scilab_fill_dotmul(Int8, ScalarDouble, M_S, Int8, Double, Int8);
+    scilab_fill_dotmul(Int8, ScalarInt8, M_S, Int8, Int8, Int8);
+    scilab_fill_dotmul(Int8, ScalarUInt8, M_S, Int8, UInt8, UInt8);
+    scilab_fill_dotmul(Int8, ScalarInt16, M_S, Int8, Int16, Int16);
+    scilab_fill_dotmul(Int8, ScalarUInt16, M_S, Int8, UInt16, UInt16);
+    scilab_fill_dotmul(Int8, ScalarInt32, M_S, Int8, Int32, Int32);
+    scilab_fill_dotmul(Int8, ScalarUInt32, M_S, Int8, UInt32, UInt32);
+    scilab_fill_dotmul(Int8, ScalarInt64, M_S, Int8, Int64, Int64);
+    scilab_fill_dotmul(Int8, ScalarUInt64, M_S, Int8, UInt64, UInt64);
+    scilab_fill_dotmul(Int8, ScalarBool, M_S, Int8, Bool, Int8);
+
+    //Scalar .* Matrix
+    scilab_fill_dotmul(ScalarInt8, Double, S_M, Int8, Double, Int8);
+    scilab_fill_dotmul(ScalarInt8, Int8, S_M, Int8, Int8, Int8);
+    scilab_fill_dotmul(ScalarInt8, UInt8, S_M, Int8, UInt8, UInt8);
+    scilab_fill_dotmul(ScalarInt8, Int16, S_M, Int8, Int16, Int16);
+    scilab_fill_dotmul(ScalarInt8, UInt16, S_M, Int8, UInt16, UInt16);
+    scilab_fill_dotmul(ScalarInt8, Int32, S_M, Int8, Int32, Int32);
+    scilab_fill_dotmul(ScalarInt8, UInt32, S_M, Int8, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarInt8, Int64, S_M, Int8, Int64, Int64);
+    scilab_fill_dotmul(ScalarInt8, UInt64, S_M, Int8, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarInt8, Bool, S_M, Int8, Bool, Int8);
+    scilab_fill_dotmul(ScalarInt8, Empty, M_E, Int8, Double, Double);
+
+    //Scalar .* Scalar
+    scilab_fill_dotmul(ScalarInt8, ScalarDouble, S_S, Int8, Double, Int8);
+    scilab_fill_dotmul(ScalarInt8, ScalarInt8, S_S, Int8, Int8, Int8);
+    scilab_fill_dotmul(ScalarInt8, ScalarUInt8, S_S, Int8, UInt8, UInt8);
+    scilab_fill_dotmul(ScalarInt8, ScalarInt16, S_S, Int8, Int16, Int16);
+    scilab_fill_dotmul(ScalarInt8, ScalarUInt16, S_S, Int8, UInt16, UInt16);
+    scilab_fill_dotmul(ScalarInt8, ScalarInt32, S_S, Int8, Int32, Int32);
+    scilab_fill_dotmul(ScalarInt8, ScalarUInt32, S_S, Int8, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarInt8, ScalarInt64, S_S, Int8, Int64, Int64);
+    scilab_fill_dotmul(ScalarInt8, ScalarUInt64, S_S, Int8, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarInt8, ScalarBool, S_S, Int8, Bool, Int8);
+
+    //UInt8
+    //Matrix .* Matrix
+    scilab_fill_dotmul(UInt8, Double, M_M, UInt8, Double, UInt8);
+    scilab_fill_dotmul(UInt8, Int8, M_M, UInt8, Int8, UInt8);
+    scilab_fill_dotmul(UInt8, UInt8, M_M, UInt8, UInt8, UInt8);
+    scilab_fill_dotmul(UInt8, Int16, M_M, UInt8, Int16, UInt16);
+    scilab_fill_dotmul(UInt8, UInt16, M_M, UInt8, UInt16, UInt16);
+    scilab_fill_dotmul(UInt8, Int32, M_M, UInt8, Int32, UInt32);
+    scilab_fill_dotmul(UInt8, UInt32, M_M, UInt8, UInt32, UInt32);
+    scilab_fill_dotmul(UInt8, Int64, M_M, UInt8, Int64, UInt64);
+    scilab_fill_dotmul(UInt8, UInt64, M_M, UInt8, UInt64, UInt64);
+    scilab_fill_dotmul(UInt8, Bool, M_M, UInt8, Bool, UInt8);
+    scilab_fill_dotmul(UInt8, Empty, M_E, UInt8, Double, Double);
+
+    //Matrix .* Scalar
+    scilab_fill_dotmul(UInt8, ScalarDouble, M_S, UInt8, Double, UInt8);
+    scilab_fill_dotmul(UInt8, ScalarInt8, M_S, UInt8, Int8, UInt8);
+    scilab_fill_dotmul(UInt8, ScalarUInt8, M_S, UInt8, UInt8, UInt8);
+    scilab_fill_dotmul(UInt8, ScalarInt16, M_S, UInt8, Int16, UInt16);
+    scilab_fill_dotmul(UInt8, ScalarUInt16, M_S, UInt8, UInt16, UInt16);
+    scilab_fill_dotmul(UInt8, ScalarInt32, M_S, UInt8, Int32, UInt32);
+    scilab_fill_dotmul(UInt8, ScalarUInt32, M_S, UInt8, UInt32, UInt32);
+    scilab_fill_dotmul(UInt8, ScalarInt64, M_S, UInt8, Int64, UInt64);
+    scilab_fill_dotmul(UInt8, ScalarUInt64, M_S, UInt8, UInt64, UInt64);
+    scilab_fill_dotmul(UInt8, ScalarBool, M_S, UInt8, Bool, UInt8);
+
+    //Scalar .* Matrix
+    scilab_fill_dotmul(ScalarUInt8, Double, S_M, UInt8, Double, UInt8);
+    scilab_fill_dotmul(ScalarUInt8, Int8, S_M, UInt8, Int8, UInt8);
+    scilab_fill_dotmul(ScalarUInt8, UInt8, S_M, UInt8, UInt8, UInt8);
+    scilab_fill_dotmul(ScalarUInt8, Int16, S_M, UInt8, Int16, UInt16);
+    scilab_fill_dotmul(ScalarUInt8, UInt16, S_M, UInt8, UInt16, UInt16);
+    scilab_fill_dotmul(ScalarUInt8, Int32, S_M, UInt8, Int32, UInt32);
+    scilab_fill_dotmul(ScalarUInt8, UInt32, S_M, UInt8, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarUInt8, Int64, S_M, UInt8, Int64, UInt64);
+    scilab_fill_dotmul(ScalarUInt8, UInt64, S_M, UInt8, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarUInt8, Bool, S_M, UInt8, Bool, UInt8);
+    scilab_fill_dotmul(ScalarUInt8, Empty, M_E, UInt8, Double, Double);
+
+    //Scalar .* Scalar
+    scilab_fill_dotmul(ScalarUInt8, ScalarDouble, S_S, UInt8, Double, UInt8);
+    scilab_fill_dotmul(ScalarUInt8, ScalarInt8, S_S, UInt8, Int8, UInt8);
+    scilab_fill_dotmul(ScalarUInt8, ScalarUInt8, S_S, UInt8, UInt8, UInt8);
+    scilab_fill_dotmul(ScalarUInt8, ScalarInt16, S_S, UInt8, Int16, UInt16);
+    scilab_fill_dotmul(ScalarUInt8, ScalarUInt16, S_S, UInt8, UInt16, UInt16);
+    scilab_fill_dotmul(ScalarUInt8, ScalarInt32, S_S, UInt8, Int32, UInt32);
+    scilab_fill_dotmul(ScalarUInt8, ScalarUInt32, S_S, UInt8, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarUInt8, ScalarInt64, S_S, UInt8, Int64, UInt64);
+    scilab_fill_dotmul(ScalarUInt8, ScalarUInt64, S_S, UInt8, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarUInt8, ScalarBool, S_S, UInt8, Bool, UInt8);
+
+    //Int16
+    //Matrix .* Matrix
+    scilab_fill_dotmul(Int16, Double, M_M, Int16, Double, Int16);
+    scilab_fill_dotmul(Int16, Int8, M_M, Int16, Int8, Int16);
+    scilab_fill_dotmul(Int16, UInt8, M_M, Int16, UInt8, UInt16);
+    scilab_fill_dotmul(Int16, Int16, M_M, Int16, Int16, Int16);
+    scilab_fill_dotmul(Int16, UInt16, M_M, Int16, UInt16, UInt16);
+    scilab_fill_dotmul(Int16, Int32, M_M, Int16, Int32, Int32);
+    scilab_fill_dotmul(Int16, UInt32, M_M, Int16, UInt32, UInt32);
+    scilab_fill_dotmul(Int16, Int64, M_M, Int16, Int64, Int64);
+    scilab_fill_dotmul(Int16, UInt64, M_M, Int16, UInt64, UInt64);
+    scilab_fill_dotmul(Int16, Bool, M_M, Int16, Bool, Int16);
+    scilab_fill_dotmul(Int16, Empty, M_E, Int16, Double, Double);
+
+    //Matrix .* Scalar
+    scilab_fill_dotmul(Int16, ScalarDouble, M_S, Int16, Double, Int16);
+    scilab_fill_dotmul(Int16, ScalarInt8, M_S, Int16, Int8, Int16);
+    scilab_fill_dotmul(Int16, ScalarUInt8, M_S, Int16, UInt8, UInt16);
+    scilab_fill_dotmul(Int16, ScalarInt16, M_S, Int16, Int16, Int16);
+    scilab_fill_dotmul(Int16, ScalarUInt16, M_S, Int16, UInt16, UInt16);
+    scilab_fill_dotmul(Int16, ScalarInt32, M_S, Int16, Int32, Int32);
+    scilab_fill_dotmul(Int16, ScalarUInt32, M_S, Int16, UInt32, UInt32);
+    scilab_fill_dotmul(Int16, ScalarInt64, M_S, Int16, Int64, Int64);
+    scilab_fill_dotmul(Int16, ScalarUInt64, M_S, Int16, UInt64, UInt64);
+    scilab_fill_dotmul(Int16, ScalarBool, M_E, Int16, Bool, Int16);
+
+    //Scalar .* Matrix
+    scilab_fill_dotmul(ScalarInt16, Double, S_M, Int16, Double, Int16);
+    scilab_fill_dotmul(ScalarInt16, Int8, S_M, Int16, Int8, Int16);
+    scilab_fill_dotmul(ScalarInt16, UInt8, S_M, Int16, UInt8, UInt16);
+    scilab_fill_dotmul(ScalarInt16, Int16, S_M, Int16, Int16, Int16);
+    scilab_fill_dotmul(ScalarInt16, UInt16, S_M, Int16, UInt16, UInt16);
+    scilab_fill_dotmul(ScalarInt16, Int32, S_M, Int16, Int32, Int32);
+    scilab_fill_dotmul(ScalarInt16, UInt32, S_M, Int16, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarInt16, Int64, S_M, Int16, Int64, Int64);
+    scilab_fill_dotmul(ScalarInt16, UInt64, S_M, Int16, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarInt16, Bool, S_M, Int16, Bool, Int16);
+    scilab_fill_dotmul(ScalarInt16, Empty, M_E, Int16, Double, Double);
+
+    //Scalar .* Scalar
+    scilab_fill_dotmul(ScalarInt16, ScalarDouble, S_S, Int16, Double, Int16);
+    scilab_fill_dotmul(ScalarInt16, ScalarInt8, S_S, Int16, Int8, Int16);
+    scilab_fill_dotmul(ScalarInt16, ScalarUInt8, S_S, Int16, UInt8, UInt16);
+    scilab_fill_dotmul(ScalarInt16, ScalarInt16, S_S, Int16, Int16, Int16);
+    scilab_fill_dotmul(ScalarInt16, ScalarUInt16, S_S, Int16, UInt16, UInt16);
+    scilab_fill_dotmul(ScalarInt16, ScalarInt32, S_S, Int16, Int32, Int32);
+    scilab_fill_dotmul(ScalarInt16, ScalarUInt32, S_S, Int16, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarInt16, ScalarInt64, S_S, Int16, Int64, Int64);
+    scilab_fill_dotmul(ScalarInt16, ScalarUInt64, S_S, Int16, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarInt16, ScalarBool, S_S, Int16, Bool, Int16);
+
+    //UInt16
+    //Matrix .* Matrix
+    scilab_fill_dotmul(UInt16, Double, M_M, UInt16, Double, UInt16);
+    scilab_fill_dotmul(UInt16, Int8, M_M, UInt16, Int8, UInt16);
+    scilab_fill_dotmul(UInt16, UInt8, M_M, UInt16, UInt8, UInt16);
+    scilab_fill_dotmul(UInt16, Int16, M_M, UInt16, Int16, UInt16);
+    scilab_fill_dotmul(UInt16, UInt16, M_M, UInt16, UInt16, UInt16);
+    scilab_fill_dotmul(UInt16, Int32, M_M, UInt16, Int32, UInt32);
+    scilab_fill_dotmul(UInt16, UInt32, M_M, UInt16, UInt32, UInt32);
+    scilab_fill_dotmul(UInt16, Int64, M_M, UInt16, Int64, UInt64);
+    scilab_fill_dotmul(UInt16, UInt64, M_M, UInt16, UInt64, UInt64);
+    scilab_fill_dotmul(UInt16, Bool, M_M, UInt16, Bool, UInt16);
+    scilab_fill_dotmul(UInt16, Empty, M_E, UInt16, Double, Double);
+
+    //Matrix .* Scalar
+    scilab_fill_dotmul(UInt16, ScalarDouble, M_S, UInt16, Double, UInt16);
+    scilab_fill_dotmul(UInt16, ScalarInt8, M_S, UInt16, Int8, UInt16);
+    scilab_fill_dotmul(UInt16, ScalarUInt8, M_S, UInt16, UInt8, UInt16);
+    scilab_fill_dotmul(UInt16, ScalarInt16, M_S, UInt16, Int16, UInt16);
+    scilab_fill_dotmul(UInt16, ScalarUInt16, M_S, UInt16, UInt16, UInt16);
+    scilab_fill_dotmul(UInt16, ScalarInt32, M_S, UInt16, Int32, UInt32);
+    scilab_fill_dotmul(UInt16, ScalarUInt32, M_S, UInt16, UInt32, UInt32);
+    scilab_fill_dotmul(UInt16, ScalarInt64, M_S, UInt16, Int64, UInt64);
+    scilab_fill_dotmul(UInt16, ScalarUInt64, M_S, UInt16, UInt64, UInt64);
+    scilab_fill_dotmul(UInt16, ScalarBool, M_S, UInt16, Bool, UInt16);
+
+    //Scalar .* Matrix
+    scilab_fill_dotmul(ScalarUInt16, Double, S_M, UInt16, Double, UInt16);
+    scilab_fill_dotmul(ScalarUInt16, Int8, S_M, UInt16, Int8, UInt16);
+    scilab_fill_dotmul(ScalarUInt16, UInt8, S_M, UInt16, UInt8, UInt16);
+    scilab_fill_dotmul(ScalarUInt16, Int16, S_M, UInt16, Int16, UInt16);
+    scilab_fill_dotmul(ScalarUInt16, UInt16, S_M, UInt16, UInt16, UInt16);
+    scilab_fill_dotmul(ScalarUInt16, Int32, S_M, UInt16, Int32, UInt32);
+    scilab_fill_dotmul(ScalarUInt16, UInt32, S_M, UInt16, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarUInt16, Int64, S_M, UInt16, Int64, UInt64);
+    scilab_fill_dotmul(ScalarUInt16, UInt64, S_M, UInt16, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarUInt16, Bool, S_M, UInt16, Bool, UInt16);
+    scilab_fill_dotmul(ScalarUInt16, Empty, S_M, UInt16, Double, UInt16);
+
+    //Scalar .* Scalar
+    scilab_fill_dotmul(ScalarUInt16, ScalarDouble, S_S, UInt16, Double, UInt16);
+    scilab_fill_dotmul(ScalarUInt16, ScalarInt8, S_S, UInt16, Int8, UInt16);
+    scilab_fill_dotmul(ScalarUInt16, ScalarUInt8, S_S, UInt16, UInt8, UInt16);
+    scilab_fill_dotmul(ScalarUInt16, ScalarInt16, S_S, UInt16, Int16, UInt16);
+    scilab_fill_dotmul(ScalarUInt16, ScalarUInt16, S_S, UInt16, UInt16, UInt16);
+    scilab_fill_dotmul(ScalarUInt16, ScalarInt32, S_S, UInt16, Int32, UInt32);
+    scilab_fill_dotmul(ScalarUInt16, ScalarUInt32, S_S, UInt16, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarUInt16, ScalarInt64, S_S, UInt16, Int64, UInt64);
+    scilab_fill_dotmul(ScalarUInt16, ScalarUInt64, S_S, UInt16, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarUInt16, ScalarBool, S_S, UInt16, Bool, UInt16);
+
+    //Int32
+    //Matrix .* Matrix
+    scilab_fill_dotmul(Int32, Double, M_M, Int32, Double, Int32);
+    scilab_fill_dotmul(Int32, Int8, M_M, Int32, Int8, Int32);
+    scilab_fill_dotmul(Int32, UInt8, M_M, Int32, UInt8, UInt32);
+    scilab_fill_dotmul(Int32, Int16, M_M, Int32, Int16, Int32);
+    scilab_fill_dotmul(Int32, UInt16, M_M, Int32, UInt16, UInt32);
+    scilab_fill_dotmul(Int32, Int32, M_M, Int32, Int32, Int32);
+    scilab_fill_dotmul(Int32, UInt32, M_M, Int32, UInt32, UInt32);
+    scilab_fill_dotmul(Int32, Int64, M_M, Int32, Int64, Int64);
+    scilab_fill_dotmul(Int32, UInt64, M_M, Int32, UInt64, UInt64);
+    scilab_fill_dotmul(Int32, Bool, M_M, Int32, Bool, Int32);
+    scilab_fill_dotmul(Int32, Empty, M_E, Int32, Double, Double);
+
+    //Matrix .* Scalar
+    scilab_fill_dotmul(Int32, ScalarDouble, M_S, Int32, Double, Int32);
+    scilab_fill_dotmul(Int32, ScalarInt8, M_S, Int32, Int8, Int32);
+    scilab_fill_dotmul(Int32, ScalarUInt8, M_S, Int32, UInt8, UInt32);
+    scilab_fill_dotmul(Int32, ScalarInt16, M_S, Int32, Int16, Int32);
+    scilab_fill_dotmul(Int32, ScalarUInt16, M_S, Int32, UInt16, UInt32);
+    scilab_fill_dotmul(Int32, ScalarInt32, M_S, Int32, Int32, Int32);
+    scilab_fill_dotmul(Int32, ScalarUInt32, M_S, Int32, UInt32, UInt32);
+    scilab_fill_dotmul(Int32, ScalarInt64, M_S, Int32, Int64, Int64);
+    scilab_fill_dotmul(Int32, ScalarUInt64, M_S, Int32, UInt64, UInt64);
+    scilab_fill_dotmul(Int32, ScalarBool, M_S, Int32, Bool, Int32);
+
+    //Scalar .* Matrix
+    scilab_fill_dotmul(ScalarInt32, Double, S_M, Int32, Double, Int32);
+    scilab_fill_dotmul(ScalarInt32, Int8, S_M, Int32, Int8, Int32);
+    scilab_fill_dotmul(ScalarInt32, UInt8, S_M, Int32, UInt8, UInt32);
+    scilab_fill_dotmul(ScalarInt32, Int16, S_M, Int32, Int16, Int32);
+    scilab_fill_dotmul(ScalarInt32, UInt16, S_M, Int32, UInt16, UInt32);
+    scilab_fill_dotmul(ScalarInt32, Int32, S_M, Int32, Int32, Int32);
+    scilab_fill_dotmul(ScalarInt32, UInt32, S_M, Int32, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarInt32, Int64, S_M, Int32, Int64, Int64);
+    scilab_fill_dotmul(ScalarInt32, UInt64, S_M, Int32, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarInt32, Bool, S_M, Int32, Bool, Int32);
+    scilab_fill_dotmul(ScalarInt32, Empty, M_E, Int32, Double, Double);
+
+    //Scalar .* Scalar
+    scilab_fill_dotmul(ScalarInt32, ScalarDouble, S_S, Int32, Double, Int32);
+    scilab_fill_dotmul(ScalarInt32, ScalarInt8, S_S, Int32, Int8, Int32);
+    scilab_fill_dotmul(ScalarInt32, ScalarUInt8, S_S, Int32, UInt8, UInt32);
+    scilab_fill_dotmul(ScalarInt32, ScalarInt16, S_S, Int32, Int16, Int32);
+    scilab_fill_dotmul(ScalarInt32, ScalarUInt16, S_S, Int32, UInt16, UInt32);
+    scilab_fill_dotmul(ScalarInt32, ScalarInt32, S_S, Int32, Int32, Int32);
+    scilab_fill_dotmul(ScalarInt32, ScalarUInt32, S_S, Int32, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarInt32, ScalarInt64, S_S, Int32, Int64, Int64);
+    scilab_fill_dotmul(ScalarInt32, ScalarUInt64, S_S, Int32, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarInt32, ScalarBool, S_S, Int32, Bool, Int32);
+
+    //UInt32
+    //Matrix .* Matrix
+    scilab_fill_dotmul(UInt32, Double, M_M, UInt32, Double, UInt32);
+    scilab_fill_dotmul(UInt32, Int8, M_M, UInt32, Int8, UInt32);
+    scilab_fill_dotmul(UInt32, UInt8, M_M, UInt32, UInt8, UInt32);
+    scilab_fill_dotmul(UInt32, Int16, M_M, UInt32, Int16, UInt32);
+    scilab_fill_dotmul(UInt32, UInt16, M_M, UInt32, UInt16, UInt32);
+    scilab_fill_dotmul(UInt32, Int32, M_M, UInt32, Int32, UInt32);
+    scilab_fill_dotmul(UInt32, UInt32, M_M, UInt32, UInt32, UInt32);
+    scilab_fill_dotmul(UInt32, Int64, M_M, UInt32, Int64, UInt64);
+    scilab_fill_dotmul(UInt32, UInt64, M_M, UInt32, UInt64, UInt64);
+    scilab_fill_dotmul(UInt32, Bool, M_M, UInt32, Bool, UInt32);
+    scilab_fill_dotmul(UInt32, Empty, M_E, UInt32, Double, Double);
+
+    //Matrix .* Scalar
+    scilab_fill_dotmul(UInt32, ScalarDouble, M_S, UInt32, Double, UInt32);
+    scilab_fill_dotmul(UInt32, ScalarInt8, M_S, UInt32, Int8, UInt32);
+    scilab_fill_dotmul(UInt32, ScalarUInt8, M_S, UInt32, UInt8, UInt32);
+    scilab_fill_dotmul(UInt32, ScalarInt16, M_S, UInt32, Int16, UInt32);
+    scilab_fill_dotmul(UInt32, ScalarUInt16, M_S, UInt32, UInt16, UInt32);
+    scilab_fill_dotmul(UInt32, ScalarInt32, M_S, UInt32, Int32, UInt32);
+    scilab_fill_dotmul(UInt32, ScalarUInt32, M_S, UInt32, UInt32, UInt32);
+    scilab_fill_dotmul(UInt32, ScalarInt64, M_S, UInt32, Int64, UInt64);
+    scilab_fill_dotmul(UInt32, ScalarUInt64, M_S, UInt32, UInt64, UInt64);
+    scilab_fill_dotmul(UInt32, ScalarBool, M_S, UInt32, Bool, UInt32);
+
+    //Scalar .* Matrix
+    scilab_fill_dotmul(ScalarUInt32, Double, S_M, UInt32, Double, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, Int8, S_M, UInt32, Int8, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, UInt8, S_M, UInt32, UInt8, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, Int16, S_M, UInt32, Int16, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, UInt16, S_M, UInt32, UInt16, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, Int32, S_M, UInt32, Int32, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, UInt32, S_M, UInt32, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, Int64, S_M, UInt32, Int64, UInt64);
+    scilab_fill_dotmul(ScalarUInt32, UInt64, S_M, UInt32, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarUInt32, Bool, S_M, UInt32, Bool, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, Empty, S_M, UInt32, Double, UInt32);
+
+    //Scalar .* Scalar
+    scilab_fill_dotmul(ScalarUInt32, ScalarDouble, S_S, UInt32, Double, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, ScalarInt8, S_S, UInt32, Int8, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, ScalarUInt8, S_S, UInt32, UInt8, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, ScalarInt16, S_S, UInt32, Int16, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, ScalarUInt16, S_S, UInt32, UInt16, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, ScalarInt32, S_S, UInt32, Int32, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, ScalarUInt32, S_S, UInt32, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarUInt32, ScalarInt64, S_S, UInt32, Int64, UInt64);
+    scilab_fill_dotmul(ScalarUInt32, ScalarUInt64, S_S, UInt32, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarUInt32, ScalarBool, S_S, UInt32, Bool, UInt32);
+
+    //Int64
+    //Matrix .* Matrix
+    scilab_fill_dotmul(Int64, Double, M_M, Int64, Double, Int64);
+    scilab_fill_dotmul(Int64, Int8, M_M, Int64, Int8, Int64);
+    scilab_fill_dotmul(Int64, UInt8, M_M, Int64, UInt8, UInt64);
+    scilab_fill_dotmul(Int64, Int16, M_M, Int64, Int16, Int64);
+    scilab_fill_dotmul(Int64, UInt16, M_M, Int64, UInt16, UInt64);
+    scilab_fill_dotmul(Int64, Int32, M_M, Int64, Int32, Int64);
+    scilab_fill_dotmul(Int64, UInt32, M_M, Int64, UInt32, UInt64);
+    scilab_fill_dotmul(Int64, Int64, M_M, Int64, Int64, Int64);
+    scilab_fill_dotmul(Int64, UInt64, M_M, Int64, UInt64, UInt64);
+    scilab_fill_dotmul(Int64, Bool, M_M, Int64, Bool, Int64);
+    scilab_fill_dotmul(Int64, Empty, M_E, Int64, Double, Double);
+
+    //Matrix .* Scalar
+    scilab_fill_dotmul(Int64, ScalarDouble, M_S, Int64, Double, Int64);
+    scilab_fill_dotmul(Int64, ScalarInt8, M_S, Int64, Int8, Int64);
+    scilab_fill_dotmul(Int64, ScalarUInt8, M_S, Int64, UInt8, UInt64);
+    scilab_fill_dotmul(Int64, ScalarInt16, M_S, Int64, Int16, Int64);
+    scilab_fill_dotmul(Int64, ScalarUInt16, M_S, Int64, UInt16, UInt64);
+    scilab_fill_dotmul(Int64, ScalarInt32, M_S, Int64, Int32, Int64);
+    scilab_fill_dotmul(Int64, ScalarUInt32, M_S, Int64, UInt32, UInt64);
+    scilab_fill_dotmul(Int64, ScalarInt64, M_S, Int64, Int64, Int64);
+    scilab_fill_dotmul(Int64, ScalarUInt64, M_S, Int64, UInt64, UInt64);
+    scilab_fill_dotmul(Int64, ScalarBool, M_S, Int64, Bool, Int64);
+
+    //Scalar .* Matrix
+    scilab_fill_dotmul(ScalarInt64, Double, S_M, Int64, Double, Int64);
+    scilab_fill_dotmul(ScalarInt64, Int8, S_M, Int64, Int8, Int64);
+    scilab_fill_dotmul(ScalarInt64, UInt8, S_M, Int64, UInt8, UInt64);
+    scilab_fill_dotmul(ScalarInt64, Int16, S_M, Int64, Int16, Int64);
+    scilab_fill_dotmul(ScalarInt64, UInt16, S_M, Int64, UInt16, UInt64);
+    scilab_fill_dotmul(ScalarInt64, Int32, S_M, Int64, Int32, Int64);
+    scilab_fill_dotmul(ScalarInt64, UInt32, S_M, Int64, UInt32, UInt64);
+    scilab_fill_dotmul(ScalarInt64, Int64, S_M, Int64, Int64, Int64);
+    scilab_fill_dotmul(ScalarInt64, UInt64, S_M, Int64, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarInt64, Bool, S_M, Int64, Bool, Int64);
+    scilab_fill_dotmul(ScalarInt64, Empty, M_E, Int64, Double, Double);
+
+    //Scalar .* Scalar
+    scilab_fill_dotmul(ScalarInt64, ScalarDouble, S_S, Int64, Double, Int64);
+    scilab_fill_dotmul(ScalarInt64, ScalarInt8, S_S, Int64, Int8, Int64);
+    scilab_fill_dotmul(ScalarInt64, ScalarUInt8, S_S, Int64, UInt8, UInt64);
+    scilab_fill_dotmul(ScalarInt64, ScalarInt16, S_S, Int64, Int16, Int64);
+    scilab_fill_dotmul(ScalarInt64, ScalarUInt16, S_S, Int64, UInt16, UInt64);
+    scilab_fill_dotmul(ScalarInt64, ScalarInt32, S_S, Int64, Int32, Int64);
+    scilab_fill_dotmul(ScalarInt64, ScalarUInt32, S_S, Int64, UInt32, UInt64);
+    scilab_fill_dotmul(ScalarInt64, ScalarInt64, S_S, Int64, Int64, Int64);
+    scilab_fill_dotmul(ScalarInt64, ScalarUInt64, S_S, Int64, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarInt64, ScalarBool, S_S, Int64, Bool, Int64);
+
+    //UInt64
+    //Matrix .* Matrix
+    scilab_fill_dotmul(UInt64, Double, M_M, UInt64, Double, UInt64);
+    scilab_fill_dotmul(UInt64, Int8, M_M, UInt64, Int8, UInt64);
+    scilab_fill_dotmul(UInt64, UInt8, M_M, UInt64, UInt8, UInt64);
+    scilab_fill_dotmul(UInt64, Int16, M_M, UInt64, Int16, UInt64);
+    scilab_fill_dotmul(UInt64, UInt16, M_M, UInt64, UInt16, UInt64);
+    scilab_fill_dotmul(UInt64, Int32, M_M, UInt64, Int32, UInt64);
+    scilab_fill_dotmul(UInt64, UInt32, M_M, UInt64, UInt32, UInt64);
+    scilab_fill_dotmul(UInt64, Int64, M_M, UInt64, Int64, UInt64);
+    scilab_fill_dotmul(UInt64, UInt64, M_M, UInt64, UInt64, UInt64);
+    scilab_fill_dotmul(UInt64, Bool, M_M, UInt64, Bool, UInt64);
+    scilab_fill_dotmul(UInt64, Empty, M_E, UInt64, Double, Double);
+
+    //Matrix .* Scalar
+    scilab_fill_dotmul(UInt64, ScalarDouble, M_S, UInt64, Double, UInt64);
+    scilab_fill_dotmul(UInt64, ScalarInt8, M_S, UInt64, Int8, UInt64);
+    scilab_fill_dotmul(UInt64, ScalarUInt8, M_S, UInt64, UInt8, UInt64);
+    scilab_fill_dotmul(UInt64, ScalarInt16, M_S, UInt64, Int16, UInt64);
+    scilab_fill_dotmul(UInt64, ScalarUInt16, M_S, UInt64, UInt16, UInt64);
+    scilab_fill_dotmul(UInt64, ScalarInt32, M_S, UInt64, Int32, UInt64);
+    scilab_fill_dotmul(UInt64, ScalarUInt32, M_S, UInt64, UInt32, UInt64);
+    scilab_fill_dotmul(UInt64, ScalarInt64, M_S, UInt64, Int64, UInt64);
+    scilab_fill_dotmul(UInt64, ScalarUInt64, M_S, UInt64, UInt64, UInt64);
+    scilab_fill_dotmul(UInt64, ScalarBool, M_S, UInt64, Bool, UInt64);
+
+    //Scalar .* Matrix
+    scilab_fill_dotmul(ScalarUInt64, Double, S_M, UInt64, Double, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, Int8, S_M, UInt64, Int8, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, UInt8, S_M, UInt64, UInt8, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, Int16, S_M, UInt64, Int16, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, UInt16, S_M, UInt64, UInt16, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, Int32, S_M, UInt64, Int32, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, UInt32, S_M, UInt64, UInt32, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, Int64, S_M, UInt64, Int64, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, UInt64, S_M, UInt64, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, Bool, S_M, UInt64, Bool, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, Empty, S_M, UInt64, Double, UInt64);
+
+    //Scalar .* Scalar
+    scilab_fill_dotmul(ScalarUInt64, ScalarDouble, S_S, UInt64, Double, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, ScalarInt8, S_S, UInt64, Int8, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, ScalarUInt8, S_S, UInt64, UInt8, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, ScalarInt16, S_S, UInt64, Int16, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, ScalarUInt16, S_S, UInt64, UInt16, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, ScalarInt32, S_S, UInt64, Int32, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, ScalarUInt32, S_S, UInt64, UInt32, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, ScalarInt64, S_S, UInt64, Int64, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, ScalarUInt64, S_S, UInt64, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarUInt64, ScalarBool, S_S, UInt64, Bool, UInt64);
+
+    //Bool
+    //Matrix + Matrix
+    scilab_fill_dotmul(Bool, Double, M_M, Bool, Double, Double);
+    scilab_fill_dotmul(Bool, Int8, M_M, Bool, Int8, Int8);
+    scilab_fill_dotmul(Bool, UInt8, M_M, Bool, UInt8, UInt8);
+    scilab_fill_dotmul(Bool, Int16, M_M, Bool, Int16, Int16);
+    scilab_fill_dotmul(Bool, UInt16, M_M, Bool, UInt16, UInt16);
+    scilab_fill_dotmul(Bool, Int32, M_M, Bool, Int32, Int32);
+    scilab_fill_dotmul(Bool, UInt32, M_M, Bool, UInt32, UInt32);
+    scilab_fill_dotmul(Bool, Int64, M_M, Bool, Int64, Int64);
+    scilab_fill_dotmul(Bool, UInt64, M_M, Bool, UInt64, UInt64);
+    scilab_fill_dotmul(Bool, Bool, M_M, Bool, Bool, Bool);
+    scilab_fill_dotmul(Bool, Empty, M_E, Bool, Double, Double);
+
+    //Matrix + Scalar
+    scilab_fill_dotmul(Bool, ScalarDouble, M_S, Bool, Double, Double);
+    scilab_fill_dotmul(Bool, ScalarInt8, M_S, Bool, Int8, Int8);
+    scilab_fill_dotmul(Bool, ScalarUInt8, M_S, Bool, UInt8, UInt8);
+    scilab_fill_dotmul(Bool, ScalarInt16, M_S, Bool, Int16, Int16);
+    scilab_fill_dotmul(Bool, ScalarUInt16, M_S, Bool, UInt16, UInt16);
+    scilab_fill_dotmul(Bool, ScalarInt32, M_S, Bool, Int32, Int32);
+    scilab_fill_dotmul(Bool, ScalarUInt32, M_S, Bool, UInt32, UInt32);
+    scilab_fill_dotmul(Bool, ScalarInt64, M_S, Bool, Int64, Int64);
+    scilab_fill_dotmul(Bool, ScalarUInt64, M_S, Bool, UInt64, UInt64);
+    scilab_fill_dotmul(Bool, ScalarBool, M_S, Bool, Bool, Bool);
+
+    //Scalar + Matrix
+    scilab_fill_dotmul(ScalarBool, Double, S_M, Bool, Double, Double);
+    scilab_fill_dotmul(ScalarBool, Int8, S_M, Bool, Int8, Int8);
+    scilab_fill_dotmul(ScalarBool, UInt8, S_M, Bool, UInt8, UInt8);
+    scilab_fill_dotmul(ScalarBool, Int16, S_M, Bool, Int16, Int16);
+    scilab_fill_dotmul(ScalarBool, UInt16, S_M, Bool, UInt16, UInt16);
+    scilab_fill_dotmul(ScalarBool, Int32, S_M, Bool, Int32, Int32);
+    scilab_fill_dotmul(ScalarBool, UInt32, S_M, Bool, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarBool, Int64, S_M, Bool, Int64, Int64);
+    scilab_fill_dotmul(ScalarBool, UInt64, S_M, Bool, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarBool, Bool, S_M, Bool, Bool, Bool);
+    scilab_fill_dotmul(ScalarBool, Empty, M_E, Bool, Double, Double);
+
+    //Scalar + Scalar
+    scilab_fill_dotmul(ScalarBool, ScalarDouble, S_S, Bool, Double, Double);
+    scilab_fill_dotmul(ScalarBool, ScalarInt8, S_S, Bool, Int8, Int8);
+    scilab_fill_dotmul(ScalarBool, ScalarUInt8, S_S, Bool, UInt8, UInt8);
+    scilab_fill_dotmul(ScalarBool, ScalarInt16, S_S, Bool, Int16, Int16);
+    scilab_fill_dotmul(ScalarBool, ScalarUInt16, S_S, Bool, UInt16, UInt16);
+    scilab_fill_dotmul(ScalarBool, ScalarInt32, S_S, Bool, Int32, Int32);
+    scilab_fill_dotmul(ScalarBool, ScalarUInt32, S_S, Bool, UInt32, UInt32);
+    scilab_fill_dotmul(ScalarBool, ScalarInt64, S_S, Bool, Int64, Int64);
+    scilab_fill_dotmul(ScalarBool, ScalarUInt64, S_S, Bool, UInt64, UInt64);
+    scilab_fill_dotmul(ScalarBool, ScalarBool, S_S, Bool, Bool, Bool);
+
+    //Identity
+    scilab_fill_dotmul(Identity, Double, I_M, Double, Double, Double);
+    scilab_fill_dotmul(Identity, DoubleComplex, I_MC, Double, Double, Double);
+    scilab_fill_dotmul(Identity, ScalarDouble, I_S, Double, Double, Double);
+    scilab_fill_dotmul(Identity, ScalarDoubleComplex, I_SC, Double, Double, Double);
+    scilab_fill_dotmul(Identity, Identity, I_I, Double, Double, Double);
+    scilab_fill_dotmul(Identity, IdentityComplex, I_IC, Double, Double, Double);
+    scilab_fill_dotmul(Identity, Empty, M_E, Double, Double, Double);
+
+    scilab_fill_dotmul(Identity, Polynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(Identity, PolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(Identity, ScalarPolynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(Identity, ScalarPolynomComplex, M_M, Double, Polynom, Polynom);
+    //scilab_fill_dotmul(Identity, Sparse, M_M, Double, Sparse, Sparse);
+    //scilab_fill_dotmul(Identity, SparseComplex, M_M, Double, Sparse, Sparse);
+
+    scilab_fill_dotmul(IdentityComplex, Double, IC_M, Double, Double, Double);
+    scilab_fill_dotmul(IdentityComplex, DoubleComplex, IC_MC, Double, Double, Double);
+    scilab_fill_dotmul(IdentityComplex, ScalarDouble, IC_S, Double, Double, Double);
+    scilab_fill_dotmul(IdentityComplex, ScalarDoubleComplex, IC_SC, Double, Double, Double);
+    scilab_fill_dotmul(IdentityComplex, Identity, IC_I, Double, Double, Double);
+    scilab_fill_dotmul(IdentityComplex, IdentityComplex, IC_IC, Double, Double, Double);
+    scilab_fill_dotmul(IdentityComplex, Empty, M_E, Double, Double, Double);
+
+    scilab_fill_dotmul(IdentityComplex, Polynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(IdentityComplex, PolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(IdentityComplex, ScalarPolynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_dotmul(IdentityComplex, ScalarPolynomComplex, M_M, Double, Polynom, Polynom);
+    //scilab_fill_dotmul(IdentityComplex, Sparse, M_M, Double, Sparse, Sparse);
+    //scilab_fill_dotmul(IdentityComplex, SparseComplex, M_M, Double, Sparse, Sparse);
+
+    //Polynom
+
+    //poly + poly
+    scilab_fill_dotmul(Polynom, Polynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_dotmul(Polynom, PolynomComplex, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_dotmul(PolynomComplex, Polynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_dotmul(PolynomComplex, PolynomComplex, M_M, Polynom, Polynom, Polynom);
+
+    //poly + scalar poly
+    scilab_fill_dotmul(Polynom, ScalarPolynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_dotmul(Polynom, ScalarPolynomComplex, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_dotmul(PolynomComplex, ScalarPolynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_dotmul(PolynomComplex, ScalarPolynomComplex, M_M, Polynom, Polynom, Polynom);
+
+    //poly + double
+    scilab_fill_dotmul(Polynom, Double, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(Polynom, DoubleComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(PolynomComplex, Double, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(PolynomComplex, DoubleComplex, M_M, Polynom, Double, Polynom);
+
+    //poly + scalar double
+    scilab_fill_dotmul(Polynom, ScalarDouble, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(Polynom, ScalarDoubleComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(PolynomComplex, ScalarDouble, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(PolynomComplex, ScalarDoubleComplex, M_M, Polynom, Double, Polynom);
+
+    //poly + []
+    scilab_fill_dotmul(Polynom, Empty, M_E, Polynom, Double, Double);
+    scilab_fill_dotmul(PolynomComplex, Empty, M_E, Polynom, Double, Double);
+
+    //poly + eye
+    scilab_fill_dotmul(Polynom, Identity, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(Polynom, IdentityComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(PolynomComplex, Identity, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(PolynomComplex, IdentityComplex, M_M, Polynom, Double, Polynom);
+
+    //scalar poly + poly
+    scilab_fill_dotmul(ScalarPolynom, Polynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_dotmul(ScalarPolynom, PolynomComplex, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_dotmul(ScalarPolynomComplex, Polynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_dotmul(ScalarPolynomComplex, PolynomComplex, M_M, Polynom, Polynom, Polynom);
+
+    //scalar poly + scalar poly
+    scilab_fill_dotmul(ScalarPolynom, ScalarPolynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_dotmul(ScalarPolynom, ScalarPolynomComplex, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_dotmul(ScalarPolynomComplex, ScalarPolynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_dotmul(ScalarPolynomComplex, ScalarPolynomComplex, M_M, Polynom, Polynom, Polynom);
+
+    //scalar poly + double
+    scilab_fill_dotmul(ScalarPolynom, Double, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(ScalarPolynom, DoubleComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(ScalarPolynomComplex, Double, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(ScalarPolynomComplex, DoubleComplex, M_M, Polynom, Double, Polynom);
+
+    //scalar poly + scalar double
+    scilab_fill_dotmul(ScalarPolynom, ScalarDouble, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(ScalarPolynom, ScalarDoubleComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(ScalarPolynomComplex, ScalarDouble, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(ScalarPolynomComplex, ScalarDoubleComplex, M_M, Polynom, Double, Polynom);
+
+    //scalar poly + []
+    scilab_fill_dotmul(ScalarPolynom, Empty, M_E, Polynom, Double, Double);
+    scilab_fill_dotmul(ScalarPolynomComplex, Empty, M_E, Polynom, Double, Double);
+
+    //scalar poly + eye
+    scilab_fill_dotmul(ScalarPolynom, Identity, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(ScalarPolynom, IdentityComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(ScalarPolynomComplex, Identity, M_M, Polynom, Double, Polynom);
+    scilab_fill_dotmul(ScalarPolynomComplex, IdentityComplex, M_M, Polynom, Double, Polynom);
+
+    //Sparse
+    scilab_fill_dotmul(Sparse, Sparse, M_M, Sparse, Sparse, Sparse);
+    scilab_fill_dotmul(Sparse, SparseComplex, M_M, Sparse, Sparse, Sparse);
+    scilab_fill_dotmul(Sparse, Double, M_M, Sparse, Double, Sparse);
+    scilab_fill_dotmul(Sparse, DoubleComplex, M_M, Sparse, Double, Sparse);
+    scilab_fill_dotmul(Sparse, ScalarDouble, M_M, Sparse, Double, Sparse);
+    scilab_fill_dotmul(Sparse, ScalarDoubleComplex, M_M, Sparse, Double, Sparse);
+
+    scilab_fill_dotmul(Sparse, Empty, M_E, Sparse, Double, Double);
+    //scilab_fill_dotmul(Sparse, Identity, M_M, Sparse, Double, Sparse);
+    //scilab_fill_dotmul(Sparse, IdentityComplex, M_M, Sparse, Double, Sparse);
+
+    scilab_fill_dotmul(SparseComplex, Sparse, M_M, Sparse, Sparse, Sparse);
+    scilab_fill_dotmul(SparseComplex, SparseComplex, M_M, Sparse, Sparse, Sparse);
+    scilab_fill_dotmul(SparseComplex, Double, M_M, Sparse, Double, Sparse);
+    scilab_fill_dotmul(SparseComplex, DoubleComplex, M_M, Sparse, Double, Sparse);
+    scilab_fill_dotmul(SparseComplex, ScalarDouble, M_M, Sparse, Double, Sparse);
+    scilab_fill_dotmul(SparseComplex, ScalarDoubleComplex, M_M, Sparse, Double, Sparse);
+
+    scilab_fill_dotmul(SparseComplex, Empty, M_E, Sparse, Double, Double);
+    //scilab_fill_dotmul(SparseComplex, Identity, M_M, Sparse, Double, Sparse);
+    //scilab_fill_dotmul(SparseComplex, IdentityComplex, M_M, Sparse, Double, Sparse);
+
+#undef scilab_fill_dotmul
+}
+
+InternalType *GenericDotTimes(InternalType *_pLeftOperand, InternalType *_pRightOperand)
+{
+    InternalType *pResult = NULL;
+
+    dotmul_function dotmul = pDotMulfunction[_pLeftOperand->getId()][_pRightOperand->getId()];
+    if (dotmul)
+    {
+        pResult = dotmul(_pLeftOperand, _pRightOperand);
+        if (pResult)
+        {
+            return pResult;
+        }
+    }
+
+    /*
+    ** Default case : Return NULL will Call Overloading.
+    */
+    return NULL;
+}
+
+//Matrix .* x
+template<class T, class U, class O>
+InternalType* dotmul_M_M(T *_pL, U *_pR)
+{
+    //check dims
+    int iDimsL = _pL->getDims();
+    int iDimsR = _pR->getDims();
+
+    if (iDimsL != iDimsR)
+    {
+        throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+    }
+
+    int* piDimsL = _pL->getDimsArray();
+    int* piDimsR = _pR->getDimsArray();
+
+    for (int i = 0 ; i < iDimsL ; ++i)
+    {
+        if (piDimsL[i] != piDimsR[i])
+        {
+            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+        }
+    }
+
+    O* pOut = new O(iDimsL, piDimsL);
+    int iSize = pOut->getSize();
+
+    dotmul(_pL->get(), iSize, _pR->get(), pOut->get());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_M_MC(T *_pL, U *_pR)
+{
+    //check dims
+    int iDimsL = _pL->getDims();
+    int iDimsR = _pR->getDims();
+
+    if (iDimsL != iDimsR)
+    {
+        throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+    }
+
+    int* piDimsL = _pL->getDimsArray();
+    int* piDimsR = _pR->getDimsArray();
+
+    for (int i = 0 ; i < iDimsL ; ++i)
+    {
+        if (piDimsL[i] != piDimsR[i])
+        {
+            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+        }
+    }
+
+    O* pOut = new O(iDimsL, piDimsL, true);
+    int iSize = pOut->getSize();
+
+    dotmul(_pL->get(), iSize, _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_M_S(T *_pL, U *_pR)
+{
+    O* pOut = new O(_pL->getDims(), _pL->getDimsArray());
+    dotmul(_pL->get(), (size_t)pOut->getSize(), _pR->get(0), pOut->get());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_M_SC(T *_pL, U *_pR)
+{
+    O* pOut = new O(_pL->getDims(), _pL->getDimsArray(), true);
+    dotmul(_pL->get(), pOut->getSize(), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_M_I(T *_pL, U *_pR)
+{
+    return NULL;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_M_IC(T *_pL, U *_pR)
+{
+    return NULL;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_M_E(T *_pL, U *_pR)
+{
+    return _pR;
+}
+
+//Matrix complex .* x
+template<class T, class U, class O>
+InternalType* dotmul_MC_M(T *_pL, U *_pR)
+{
+    //check dims
+    int iDimsL = _pL->getDims();
+    int iDimsR = _pR->getDims();
+
+    if (iDimsL != iDimsR)
+    {
+        throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+    }
+
+    int* piDimsL = _pL->getDimsArray();
+    int* piDimsR = _pR->getDimsArray();
+
+    for (int i = 0 ; i < iDimsL ; ++i)
+    {
+        if (piDimsL[i] != piDimsR[i])
+        {
+            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+        }
+    }
+
+    O* pOut = new O(iDimsL, piDimsL, true);
+    int iSize = pOut->getSize();
+
+    dotmul(_pL->get(), _pL->getImg(), iSize, _pR->get(), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_MC_MC(T *_pL, U *_pR)
+{
+    //check dims
+    int iDimsL = _pL->getDims();
+    int iDimsR = _pR->getDims();
+
+    if (iDimsL != iDimsR)
+    {
+        throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+    }
+
+    int* piDimsL = _pL->getDimsArray();
+    int* piDimsR = _pR->getDimsArray();
+
+    for (int i = 0 ; i < iDimsL ; ++i)
+    {
+        if (piDimsL[i] != piDimsR[i])
+        {
+            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+        }
+    }
+
+    O* pOut = new O(iDimsL, piDimsL, true);
+    int iSize = pOut->getSize();
+
+    dotmul(_pL->get(), _pL->getImg(), iSize, _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_MC_S(T *_pL, U *_pR)
+{
+    O* pOut = new O(_pL->getDims(), _pL->getDimsArray(), true);
+    dotmul(_pL->get(), _pL->getImg(), pOut->getSize(), _pR->get(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_MC_SC(T *_pL, U *_pR)
+{
+    O* pOut = new O(_pL->getDims(), _pL->getDimsArray(), true);
+    dotmul(_pL->get(), _pL->getImg(), pOut->getSize(), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_MC_I(T *_pL, U *_pR)
+{
+    return NULL;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_MC_IC(T *_pL, U *_pR)
+{
+    return NULL;
+}
+
+//Scalar .* x
+template<class T, class U, class O>
+InternalType* dotmul_S_M(T *_pL, U *_pR)
+{
+    return dotmul_M_S<U, T, O>(_pR, _pL);
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_S_MC(T *_pL, U *_pR)
+{
+    return dotmul_MC_S<U, T, O>(_pR, _pL);
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_S_S(T *_pL, U *_pR)
+{
+    O* pOut = new O(0);
+    dotmul(_pL->get(0), _pR->get(0), pOut->get());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_S_SC(T *_pL, U *_pR)
+{
+    O* pOut = new O(0.0, 0.0);
+    dotmul(_pL->get(), 1, _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_S_I(T *_pL, U *_pR)
+{
+    O* pOut = (O*)_pR->clone();
+    dotmul(_pL->get(0), _pR->get(0), pOut->get());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_S_IC(T *_pL, U *_pR)
+{
+    O* pOut = (O*)_pR->clone();
+    dotmul(_pL->get(0), 1, _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+//Scalar complex .* x
+template<class T, class U, class O>
+InternalType* dotmul_SC_M(T *_pL, U *_pR)
+{
+    return dotmul_M_SC<U, T, O>(_pR, _pL);
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_SC_MC(T *_pL, U *_pR)
+{
+    return dotmul_MC_SC<U, T, O>(_pR, _pL);
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_SC_S(T *_pL, U *_pR)
+{
+    return dotmul_S_SC<U, T, O>(_pR, _pL);
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_SC_SC(T *_pL, U *_pR)
+{
+    O* pOut = new O(0.0, 0.0);
+    dotmul(_pL->get(0), _pL->getImg(0), 1, _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_SC_I(T *_pL, U *_pR)
+{
+    O* pOut = (O*)_pR->clone();
+    pOut->setComplex(true);
+    dotmul(_pL->get(0), _pL->getImg(0), 1, _pR->get(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_SC_IC(T *_pL, U *_pR)
+{
+    O* pOut = (O*)_pR->clone();
+    dotmul(_pL->get(0), _pL->getImg(0), 1, _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+//Identity .* x
+template<class T, class U, class O>
+InternalType* dotmul_I_M(T *_pL, U *_pR)
+{
+    return NULL;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_I_MC(T *_pL, U *_pR)
+{
+    return NULL;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_I_S(T *_pL, U *_pR)
+{
+    return dotmul_S_I<U, T, O>(_pR, _pL);
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_I_SC(T *_pL, U *_pR)
+{
+    return dotmul_SC_I<U, T, O>(_pR, _pL);
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_I_I(T *_pL, U *_pR)
+{
+    O* pOut = (O*)_pL->clone();
+    dotmul(_pL->get(0), _pR->get(0), pOut->get());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_I_IC(T *_pL, U *_pR)
+{
+    O* pOut = (O*)_pR->clone();
+    dotmul(_pL->get(0), 1, _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+//Identity complex .* x
+template<class T, class U, class O>
+InternalType* dotmul_IC_M(T *_pL, U *_pR)
+{
+    return NULL;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_IC_MC(T *_pL, U *_pR)
+{
+    return NULL;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_IC_S(T *_pL, U *_pR)
+{
+    return dotmul_S_IC<U, T, O>(_pR, _pL);
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_IC_SC(T *_pL, U *_pR)
+{
+    return dotmul_SC_IC<U, T, O>(_pR, _pL);
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_IC_I(T *_pL, U *_pR)
+{
+    O* pOut = (O*)_pL->clone();
+    dotmul(_pL->get(0), _pL->getImg(0), 1, _pR->get(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* dotmul_IC_IC(T *_pL, U *_pR)
+{
+    O* pOut = (O*)_pL->clone();
+    dotmul(_pL->get(0), _pL->getImg(0), 1, _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+//Empty .* x
+template<class T, class U, class O>
+InternalType* dotmul_E_M(T *_pL, U *_pR)
+{
+    return _pL;
+}
+
+template<>
+InternalType* dotmul_M_M<Sparse, Sparse, Sparse>(Sparse* _pL, Sparse* _pR)
+{
+    //check dims
+    if (_pL->isScalar())
+    {
+        Sparse* pOut = NULL;
+        std::complex<double> c(_pL->getImg(0, 0));
+        Double* pL = NULL;
+        if (c.imag())
+        {
+            pL = new Double(c.real(), c.imag());
+        }
+        else
+        {
+            pL = new Double(c.real());
+        }
+        pOut = (Sparse*)dotmul_M_M<Double, Sparse, Sparse>(pL, _pR);
+        delete pL;
+        return pOut;
+    }
+
+    if (_pR->isScalar())
+    {
+        Sparse* pOut = NULL;
+        std::complex<double> c(_pR->getImg(0, 0));
+        Double* pR = NULL;
+        if (c.imag())
+        {
+            pR = new Double(c.real(), c.imag());
+        }
+        else
+        {
+            pR = new Double(c.real());
+        }
+        pOut = (Sparse*)dotmul_M_M<Sparse, Double, Sparse>(_pL, pR);
+        delete pR;
+        return pOut;
+    }
+
+    //check dimensions
+    if (_pL->getRows() != _pR->getRows() || _pL->getCols() != _pR->getCols())
+    {
+        throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+    }
+
+    return _pL->dotMultiply(*_pR);
+}
+
+//[] .* SP
+template<>
+InternalType* dotmul_M_M<Double, Sparse, Double>(Double* _pL, Sparse* _pR)
+{
+    return _pL;
+}
+
+//SP .* []
+template<>
+InternalType* dotmul_M_M<Sparse, Double, Double>(Sparse* _pL, Double* _pR)
+{
+    return _pR;
+}
+
+template<>
+InternalType* dotmul_M_M<Double, Sparse, Sparse>(Double* _pL, Sparse* _pR)
+{
+    //D * SP
+    if (_pL->isScalar())
+    {
+        //d * SP -> SP
+        Sparse* pOut = NULL;
+        if (_pL->isComplex())
+        {
+            std::complex<double> dbl(_pL->get(0), _pL->getImg(0));
+            return _pR->multiply(dbl);
+        }
+        else
+        {
+            return _pR->multiply(_pL->get(0));
+        }
+    }
+
+    if (_pR->isScalar())
+    {
+        //D * sp -> D .* d
+        Double* pD = NULL;
+
+        if (_pR->isComplex())
+        {
+            std::complex<double> dbl(_pR->getImg(0, 0));
+            pD = new Double(dbl.real(), dbl.imag());
+        }
+        else
+        {
+            pD = new Double(_pR->get(0, 0));
+        }
+
+        InternalType* pIT = GenericDotTimes(_pL, pD);
+        delete pD;
+        return pIT;
+    }
+
+
+    //check dimensions
+    if (_pL->getDims() != 2 || _pL->getRows() != _pR->getRows() || _pL->getCols() != _pR->getCols())
+    {
+        throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+    }
+
+    //get some information
+    int iNonZeros = static_cast<int>(_pR->nonZeros());
+    int* pRows = new int[iNonZeros * 2];
+    _pR->outputRowCol(pRows);
+    int* pCols = pRows + iNonZeros;
+    double* pValR = new double[iNonZeros];
+    double* pValI = new double[iNonZeros];
+    _pR->outputValues(pValR, pValI);
+    double* pdblR = _pL->get();
+    int iRows = _pL->getRows();
+
+    Sparse* pOut = new Sparse(_pL->getRows(), _pL->getCols(), _pL->isComplex() || _pR->isComplex());
+
+    if (_pL->isComplex() == false)
+    {
+        if (_pR->isComplex() == false)
+        {
+            for (int i = 0 ; i < iNonZeros ; i++)
+            {
+                int iRow = static_cast<int>(pRows[i]) - 1;
+                int iCol = static_cast<int>(pCols[i]) - 1;
+                int index = iCol * iRows + iRow;
+
+                pOut->set(iRow, iCol,  pdblR[index] * pValR[i]);
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < iNonZeros ; i++)
+            {
+                int iRow = static_cast<int>(pRows[i]) - 1;
+                int iCol = static_cast<int>(pCols[i]) - 1;
+                int index = iCol * iRows + iRow;
+
+                std::complex<double> c;
+                c.real(pdblR[index] * pValR[i]);
+                c.imag(pdblR[index] * pValI[i]);
+                pOut->set(iRow, iCol,  c);
+            }
+        }
+    }
+    else
+    {
+        double* pdblI = _pL->getImg();
+        if (_pR->isComplex() == false)
+        {
+            for (int i = 0 ; i < iNonZeros ; i++)
+            {
+                int iRow = static_cast<int>(pRows[i]) - 1;
+                int iCol = static_cast<int>(pCols[i]) - 1;
+                int index = iCol * iRows + iRow;
+
+                std::complex<double> c;
+                c.real(pdblR[index] * pValR[i]);
+                c.imag(pdblI[index] * pValR[i]);
+                pOut->set(iRow, iCol,  c);
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < iNonZeros ; i++)
+            {
+                int iRow = static_cast<int>(pRows[i]) - 1;
+                int iCol = static_cast<int>(pCols[i]) - 1;
+                int index = iCol * iRows + iRow;
+
+                std::complex<double> c;
+                c.real(pdblR[index] * pValR[i] - pdblI[index] * pValI[i]);
+                c.imag(pdblR[index] * pValI[i] + pdblI[index] * pValR[i]);
+                pOut->set(iRow, iCol,  c);
+            }
+        }
+    }
+
+    delete[] pRows;
+    delete[] pValR;
+    delete[] pValI;
+
+    return pOut;
+}
+
+template<>
+InternalType* dotmul_M_M<Sparse, Double, Sparse>(Sparse* _pL, Double* _pR)
+{
+    return dotmul_M_M<Double, Sparse, Sparse>(_pR, _pL);
+}
+
+//Polynom
+template<>
+InternalType* dotmul_M_M<Polynom, Polynom, Polynom>(Polynom* _pL, Polynom* _pR)
+{
+    //check varname
+    if (_pL->getVariableName() != _pR->getVariableName())
+    {
+        //call overload
+        return NULL;
+    }
+
+    int iDimsL = _pL->getDims();
+    int iDimsR = _pR->getDims();
+    int* piDimsL = _pL->getDimsArray();
+    int* piDimsR = _pR->getDimsArray();
+
+    if (_pL->isScalar())
+    {
+        Polynom* pOut = new Polynom(_pL->getVariableName(), iDimsR, piDimsR);
+        int iSize = pOut->getSize();
+        SinglePoly** pSPOut = pOut->get();
+        SinglePoly* pSPL = _pL->get(0);
+        SinglePoly** pSPR = _pR->get();
+
+        for (int i = 0 ; i < iSize ; ++i)
+        {
+            pSPOut[i] = *pSPL * *pSPR[i];
+        }
+
+        return pOut;
+    }
+
+    if (_pR->isScalar())
+    {
+        Polynom* pOut = new Polynom(_pL->getVariableName(), iDimsL, piDimsL);
+        int iSize = pOut->getSize();
+        SinglePoly** pSPOut = pOut->get();
+        SinglePoly** pSPL = _pL->get();
+        SinglePoly* pSPR = _pR->get(0);
+
+        for (int i = 0 ; i < iSize ; ++i)
+        {
+            pSPOut[i] = *pSPL[i] * *pSPR;
+        }
+
+        return pOut;
+    }
+
+    //check dims
+    if (iDimsL != iDimsR)
+    {
+        throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+    }
+
+    for (int i = 0 ; i < iDimsL ; ++i)
+    {
+        if (piDimsL[i] != piDimsR[i])
+        {
+            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+        }
+    }
+
+    Polynom* pOut = new Polynom(_pL->getVariableName(), iDimsL, piDimsR);
+    int iSize = pOut->getSize();
+    SinglePoly** pSPOut = pOut->get();
+    SinglePoly** pSPL = _pL->get();
+    SinglePoly** pSPR = _pR->get();
+
+    for (int i = 0 ; i < iSize ; ++i)
+    {
+        pSPOut[i] = *pSPL[i] * *pSPR[i];
+    }
+
+    return pOut;
+}
+
+template<>
+InternalType* dotmul_M_M<Polynom, Double, Polynom>(Polynom* _pL, Double* _pR)
+{
+    return dotmul_M_M<Double, Polynom, Polynom>(_pR, _pL);
+}
+
+template<>
+InternalType* dotmul_M_M<Double, Polynom, Polynom>(Double* _pL, Polynom* _pR)
+{
+    Polynom* pOut = NULL;
+
+    bool isComplexL = _pL->isComplex();
+    bool isComplexR = _pR->isComplex();
+    bool isComplexOut = isComplexL || isComplexR;
+
+    if (_pL->isScalar())
+    {
+        pOut = (Polynom*)_pR->clone();
+        SinglePoly** pSPR = _pR->get();
+        SinglePoly** pSP = pOut->get();
+        int iSize = pOut->getSize();
+
+        double dblR = _pL->get(0);
+        if (isComplexL)
+        {
+            double dblI = _pL->getImg(0);
+            pOut->setComplex(true);
+            if (isComplexR)
+            {
+                for (int i = 0 ; i < iSize ; i++)
+                {
+                    dotmul(pSPR[i]->get(), pSPR[i]->getImg(), (size_t)pSPR[i]->getSize(), dblR, dblI, pSP[i]->get(), pSP[i]->getImg());
+                }
+            }
+            else
+            {
+                for (int i = 0 ; i < iSize ; i++)
+                {
+                    dotmul(pSP[i]->get(), (size_t)pSP[i]->getSize(), dblR, dblI, pSP[i]->get(), pSP[i]->getImg());
+                }
+            }
+        }
+        else
+        {
+            if (isComplexR)
+            {
+                for (int i = 0 ; i < iSize ; i++)
+                {
+                    dotmul(pSP[i]->get(), pSP[i]->getImg(), (size_t)pSP[i]->getSize(), dblR, pSP[i]->get(), pSP[i]->getImg());
+                }
+            }
+            else
+            {
+                //r .* P
+                for (int i = 0 ; i < iSize ; i++)
+                {
+                    dotmul(pSP[i]->get(), (size_t)pSP[i]->getSize(), dblR, pSP[i]->get());
+                }
+            }
+        }
+
+        return pOut;
+    }
+
+    if (_pR->isScalar())
+    {
+        pOut = new Polynom(_pR->getVariableName(), _pL->getDims(), _pL->getDimsArray());
+        SinglePoly* pSPL = _pR->get(0);
+        SinglePoly** pSP = pOut->get();
+        int iSize = pOut->getSize();
+        double* pdblLR = _pL->get();
+        double* pdblLI = NULL;
+        if (isComplexL)
+        {
+            pdblLI  = _pL->getImg();
+        }
+
+        double* pdblRR = pSPL->get();
+        double* pdblRI = NULL;
+        if (isComplexR)
+        {
+            pdblRI = pSPL->getImg();
+        }
+
+        if (isComplexL)
+        {
+            if (isComplexR)
+            {
+                for (int i = 0 ; i < iSize ; ++i)
+                {
+                    SinglePoly* pSPOut = (SinglePoly*)pSPL->clone();
+                    int iSPSize = pSPOut->getSize();
+                    pSPOut->setComplex(isComplexOut);
+
+                    double* pdblOutR = pSPOut->get();
+                    double* pdblOutI = pSPOut->getImg();
+
+                    dotmul(pdblRR, pdblRI, (size_t)iSPSize, pdblLR[i], pdblLI[i], pdblOutR, pdblOutI);
+                    pSP[i] = pSPOut;
+                }
+            }
+            else
+            {
+                for (int i = 0 ; i < iSize ; ++i)
+                {
+                    SinglePoly* pSPOut = (SinglePoly*)pSPL->clone();
+                    int iSPSize = pSPOut->getSize();
+                    pSPOut->setComplex(isComplexOut);
+
+                    double* pdblOutR = pSPOut->get();
+                    double* pdblOutI = pSPOut->getImg();
+                    dotmul(pdblRR, (size_t)iSPSize, pdblLR[i], pdblLI[i], pdblOutR, pdblOutI);
+                    pSP[i] = pSPOut;
+                }
+            }
+        }
+        else
+        {
+            if (isComplexR)
+            {
+                for (int i = 0 ; i < iSize ; ++i)
+                {
+                    SinglePoly* pSPOut = (SinglePoly*)pSPL->clone();
+                    int iSPSize = pSPOut->getSize();
+                    pSPOut->setComplex(isComplexOut);
+
+                    double* pdblOutR = pSPOut->get();
+                    double* pdblOutI = pSPOut->getImg();
+                    dotmul(pdblRR, pdblRI, (size_t)iSPSize, pdblLR[i], pdblOutR, pdblOutI);
+                    pSP[i] = pSPOut;
+                }
+            }
+            else
+            {
+                for (int i = 0 ; i < iSize ; ++i)
+                {
+                    SinglePoly* pSPOut = (SinglePoly*)pSPL->clone();
+                    int iSPSize = pSPOut->getSize();
+                    pSPOut->setComplex(isComplexOut);
+
+                    double* pdblOutR = pSPOut->get();
+                    dotmul(pdblRR, (size_t)iSPSize, pdblLR[i], pdblOutR);
+                    pSP[i] = pSPOut;
+                }
+            }
+        }
+
+        return pOut;
+
+    }
+
+    //check dims
+    int iDimsL = _pL->getDims();
+    int iDimsR = _pR->getDims();
+
+    if (iDimsL != iDimsR)
+    {
+        throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+    }
+
+    int* piDimsL = _pL->getDimsArray();
+    int* piDimsR = _pR->getDimsArray();
+
+    for (int i = 0 ; i < iDimsL ; ++i)
+    {
+        if (piDimsL[i] != piDimsR[i])
+        {
+            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+        }
+    }
+
+
+    pOut = (Polynom*)_pR->clone();
+    pOut->setComplex(isComplexOut);
+    SinglePoly** pSPR = _pR->get();
+    SinglePoly** pSP = pOut->get();
+    int iSize = pOut->getSize();
+
+    double* pdblR = _pL->get();
+    double* pdblI = NULL;
+    if (isComplexL)
+    {
+        pdblI = _pL->getImg();
+    }
+
+    if (isComplexL)
+    {
+        if (isComplexR)
+        {
+            for (int i = 0 ; i < iSize ; i++)
+            {
+                dotmul(pSPR[i]->get(), pSPR[i]->getImg(), (size_t)pSPR[i]->getSize(), pdblR[i], pdblI[i], pSP[i]->get(), pSP[i]->getImg());
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < iSize ; i++)
+            {
+                dotmul(pSPR[i]->get(), (size_t)pSPR[i]->getSize(), pdblR[i], pdblI[i], pSP[i]->get(), pSP[i]->getImg());
+            }
+        }
+    }
+    else
+    {
+        if (isComplexR)
+        {
+            for (int i = 0 ; i < iSize ; i++)
+            {
+                dotmul(pSPR[i]->get(), pSPR[i]->getImg(), (size_t)pSPR[i]->getSize(), pdblR[i], pSP[i]->get(), pSP[i]->getImg());
+            }
+        }
+        else
+        {
+            //r .* P
+            for (int i = 0 ; i < iSize ; i++)
+            {
+                dotmul(pSPR[i]->get(), (size_t)pSPR[i]->getSize(), pdblR[i], pSP[i]->get());
+            }
+        }
+    }
+
+    return pOut;
+}
index c104359..e8efe7e 100644 (file)
 
 #include "types_multiplication.hxx"
 #include "types_addition.hxx"
-#include "arrayof.hxx"
+#include "double.hxx"
+#include "int.hxx"
+#include "sparse.hxx"
+#include "polynom.hxx"
+#include "singlepoly.hxx"
 
 #include "scilabexception.hxx"
 
@@ -27,146 +31,8 @@ extern "C"
 #include "elem_common.h"
 }
 
-using namespace types;
-
-InternalType *GenericDotTimes(InternalType *_pLeftOperand, InternalType *_pRightOperand)
-{
-    InternalType *pResult = NULL;
-
-    if (_pLeftOperand->isDouble() && _pLeftOperand->getAs<Double>()->isEmpty())
-    {
-        return Double::Empty();
-    }
 
-    if (_pRightOperand->isDouble() && _pRightOperand->getAs<Double>()->isEmpty())
-    {
-        return Double::Empty();
-    }
-
-    /*
-    ** DOUBLE .* DOUBLE
-    */
-    if (_pLeftOperand->isDouble() && _pRightOperand->isDouble())
-    {
-        Double *pL   = _pLeftOperand->getAs<Double>();
-        Double *pR   = _pRightOperand->getAs<Double>();
-
-        int iResult = DotMultiplyDoubleByDouble(pL, pR, (Double**)&pResult);
-        if (iResult)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-
-        return pResult;
-    }
-
-    /*
-    ** SPARSE .* SPARSE
-    */
-    if (_pLeftOperand->isSparse() && _pRightOperand->isSparse())
-    {
-        Sparse *pL   = _pLeftOperand->getAs<Sparse>();
-        Sparse *pR   = _pRightOperand->getAs<Sparse>();
-
-        int iResult = DotMultiplySparseBySparse(pL, pR, (Sparse**)&pResult);
-        if (iResult)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-
-        return pResult;
-    }
-
-    /*
-    ** SPARSE .* DOUBLE
-    */
-    if (_pLeftOperand->isSparse() && _pRightOperand->isDouble())
-    {
-        Sparse *pL   = _pLeftOperand->getAs<Sparse>();
-        Double *pR   = _pRightOperand->getAs<Double>();
-
-        int iResult = DotMultiplySparseByDouble(pL, pR, (GenericType**)&pResult);
-        if (iResult)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-
-        return pResult;
-    }
-
-    /*
-    ** DOUBLE .* SPARSE
-    */
-    if (_pLeftOperand->isDouble() && _pRightOperand->isSparse())
-    {
-        Double *pL   = _pLeftOperand->getAs<Double>();
-        Sparse *pR   = _pRightOperand->getAs<Sparse>();
-
-        int iResult = DotMultiplyDoubleBySparse(pL, pR, (GenericType**)&pResult);
-        if (iResult)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-
-        return pResult;
-    }
-
-    /*
-    ** DOUBLE .* POLY
-    */
-    if (_pLeftOperand->isDouble() && _pRightOperand->isPoly())
-    {
-        Double *pL   = _pLeftOperand->getAs<Double>();
-        Polynom *pR  = _pRightOperand->getAs<Polynom>();
-
-        int iResult = DotMultiplyDoubleByPoly(pL, pR, (Polynom**)&pResult);
-        if (iResult)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-
-        return pResult;
-    }
-
-    /*
-    ** POLY .* DOUBLE
-    */
-    if (_pLeftOperand->isPoly() && _pRightOperand->isDouble())
-    {
-        Polynom *pL   = _pLeftOperand->getAs<Polynom>();
-        Double *pR    = _pRightOperand->getAs<Double>();
-
-        int iResult = DotMultiplyPolyByDouble(pL, pR, (Polynom**)&pResult);
-        if (iResult)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-
-        return pResult;
-    }
-
-    /*
-    ** POLY .* POLY
-    */
-    if (_pLeftOperand->isPoly() && _pRightOperand->isPoly())
-    {
-        Polynom *pL   = _pLeftOperand->getAs<Polynom>();
-        Polynom *pR   = _pRightOperand->getAs<Polynom>();
-
-        int iResult = DotMultiplyPolyByPoly(pL, pR, (Polynom**)&pResult);
-        if (iResult)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-
-        return pResult;
-    }
-
-    /*
-    ** Default case : Return NULL will Call Overloading.
-    */
-    return NULL;
-}
+using namespace types;
 
 InternalType *GenericTimes(InternalType *_pLeftOperand, InternalType *_pRightOperand)
 {
@@ -503,6 +369,7 @@ int DotMultiplyDoubleByDouble(Double* _pDouble1, Double* _pDouble2, Double**  _p
 
     return 0;
 }
+
 int MultiplyDoubleByPoly(Double* _pDouble, Polynom* _pPoly, Polynom** _pPolyOut)
 {
     bool bComplex1  = _pDouble->isComplex();
@@ -1777,3 +1644,4 @@ int DotMultiplyPolyByPoly(Polynom* _pPoly1, Polynom* _pPoly2, Polynom** _pPolyOu
 
     return 0;
 }
+
index f9982c2..6c267c0 100644 (file)
@@ -23,7 +23,6 @@
 
 extern "C"
 {
-#include "matrix_subtraction.h"
 #include "elem_common.h" //dset
 }
 
@@ -209,7 +208,7 @@ void fillSubtractFunction()
     scilab_fill_sub(Int8, Int64, M_M, Int8, Int64, Int64);
     scilab_fill_sub(Int8, UInt64, M_M, Int8, UInt64, UInt64);
     scilab_fill_sub(Int8, Bool, M_M, Int8, Bool, Int8);
-    scilab_fill_sub(Int8, Empty, M_M, Int8, Double, Int8);
+    scilab_fill_sub(Int8, Empty, M_E, Int8, Double, Int8);
 
     //Matrix - Scalar
     scilab_fill_sub(Int8, ScalarDouble, M_S, Int8, Double, Int8);
@@ -234,7 +233,7 @@ void fillSubtractFunction()
     scilab_fill_sub(ScalarInt8, Int64, S_M, Int8, Int64, Int64);
     scilab_fill_sub(ScalarInt8, UInt64, S_M, Int8, UInt64, UInt64);
     scilab_fill_sub(ScalarInt8, Bool, S_M, Int8, Bool, Int8);
-    scilab_fill_sub(ScalarInt8, Empty, M_M, Int8, Double, Int8);
+    scilab_fill_sub(ScalarInt8, Empty, S_E, Int8, Double, Int8);
 
     //Scalar - Scalar
     scilab_fill_sub(ScalarInt8, ScalarDouble, S_S, Int8, Double, Int8);
@@ -260,7 +259,7 @@ void fillSubtractFunction()
     scilab_fill_sub(UInt8, Int64, M_M, UInt8, Int64, UInt64);
     scilab_fill_sub(UInt8, UInt64, M_M, UInt8, UInt64, UInt64);
     scilab_fill_sub(UInt8, Bool, M_M, UInt8, Bool, UInt8);
-    scilab_fill_sub(UInt8, Empty, M_M, UInt8, Double, UInt8);
+    scilab_fill_sub(UInt8, Empty, M_E, UInt8, Double, UInt8);
 
     //Matrix - Scalar
     scilab_fill_sub(UInt8, ScalarDouble, M_S, UInt8, Double, UInt8);
@@ -285,7 +284,7 @@ void fillSubtractFunction()
     scilab_fill_sub(ScalarUInt8, Int64, S_M, UInt8, Int64, UInt64);
     scilab_fill_sub(ScalarUInt8, UInt64, S_M, UInt8, UInt64, UInt64);
     scilab_fill_sub(ScalarUInt8, Bool, S_M, UInt8, Bool, UInt8);
-    scilab_fill_sub(ScalarUInt8, Empty, S_M, UInt8, Double, UInt8);
+    scilab_fill_sub(ScalarUInt8, Empty, S_E, UInt8, Double, UInt8);
 
     //Scalar - Scalar
     scilab_fill_sub(ScalarUInt8, ScalarDouble, S_S, UInt8, Double, UInt8);
@@ -311,7 +310,7 @@ void fillSubtractFunction()
     scilab_fill_sub(Int16, Int64, M_M, Int16, Int64, Int64);
     scilab_fill_sub(Int16, UInt64, M_M, Int16, UInt64, UInt64);
     scilab_fill_sub(Int16, Bool, M_M, Int16, Bool, Int16);
-    scilab_fill_sub(Int16, Empty, M_M, Int16, Double, Int16);
+    scilab_fill_sub(Int16, Empty, M_E, Int16, Double, Int16);
 
     //Matrix - Scalar
     scilab_fill_sub(Int16, ScalarDouble, M_S, Int16, Double, Int16);
@@ -336,7 +335,7 @@ void fillSubtractFunction()
     scilab_fill_sub(ScalarInt16, Int64, S_M, Int16, Int64, Int64);
     scilab_fill_sub(ScalarInt16, UInt64, S_M, Int16, UInt64, UInt64);
     scilab_fill_sub(ScalarInt16, Bool, S_M, Int16, Bool, Int16);
-    scilab_fill_sub(ScalarInt16, Empty, M_M, Int16, Double, Int16);
+    scilab_fill_sub(ScalarInt16, Empty, S_E, Int16, Double, Int16);
 
     //Scalar - Scalar
     scilab_fill_sub(ScalarInt16, ScalarDouble, S_S, Int16, Double, Int16);
@@ -362,7 +361,7 @@ void fillSubtractFunction()
     scilab_fill_sub(UInt16, Int64, M_M, UInt16, Int64, UInt64);
     scilab_fill_sub(UInt16, UInt64, M_M, UInt16, UInt64, UInt64);
     scilab_fill_sub(UInt16, Bool, M_M, UInt16, Bool, UInt16);
-    scilab_fill_sub(UInt16, Empty, M_M, UInt16, Double, UInt16);
+    scilab_fill_sub(UInt16, Empty, M_E, UInt16, Double, UInt16);
 
     //Matrix - Scalar
     scilab_fill_sub(UInt16, ScalarDouble, M_S, UInt16, Double, UInt16);
@@ -387,7 +386,7 @@ void fillSubtractFunction()
     scilab_fill_sub(ScalarUInt16, Int64, S_M, UInt16, Int64, UInt64);
     scilab_fill_sub(ScalarUInt16, UInt64, S_M, UInt16, UInt64, UInt64);
     scilab_fill_sub(ScalarUInt16, Bool, S_M, UInt16, Bool, UInt16);
-    scilab_fill_sub(ScalarUInt16, Empty, S_M, UInt16, Double, UInt16);
+    scilab_fill_sub(ScalarUInt16, Empty, S_E, UInt16, Double, UInt16);
 
     //Scalar - Scalar
     scilab_fill_sub(ScalarUInt16, ScalarDouble, S_S, UInt16, Double, UInt16);
@@ -413,7 +412,7 @@ void fillSubtractFunction()
     scilab_fill_sub(Int32, Int64, M_M, Int32, Int64, Int64);
     scilab_fill_sub(Int32, UInt64, M_M, Int32, UInt64, UInt64);
     scilab_fill_sub(Int32, Bool, M_M, Int32, Bool, Int32);
-    scilab_fill_sub(Int32, Empty, M_M, Int32, Double, Int32);
+    scilab_fill_sub(Int32, Empty, M_E, Int32, Double, Int32);
 
     //Matrix - Scalar
     scilab_fill_sub(Int32, ScalarDouble, M_S, Int32, Double, Int32);
@@ -438,7 +437,7 @@ void fillSubtractFunction()
     scilab_fill_sub(ScalarInt32, Int64, S_M, Int32, Int64, Int64);
     scilab_fill_sub(ScalarInt32, UInt64, S_M, Int32, UInt64, UInt64);
     scilab_fill_sub(ScalarInt32, Bool, S_M, Int32, Bool, Int32);
-    scilab_fill_sub(ScalarInt32, Empty, M_M, Int32, Double, Int32);
+    scilab_fill_sub(ScalarInt32, Empty, S_E, Int32, Double, Int32);
 
     //Scalar - Scalar
     scilab_fill_sub(ScalarInt32, ScalarDouble, S_S, Int32, Double, Int32);
@@ -464,7 +463,7 @@ void fillSubtractFunction()
     scilab_fill_sub(UInt32, Int64, M_M, UInt32, Int64, UInt64);
     scilab_fill_sub(UInt32, UInt64, M_M, UInt32, UInt64, UInt64);
     scilab_fill_sub(UInt32, Bool, M_M, UInt32, Bool, UInt32);
-    scilab_fill_sub(UInt32, Empty, M_M, UInt32, Double, UInt32);
+    scilab_fill_sub(UInt32, Empty, M_E, UInt32, Double, UInt32);
 
     //Matrix - Scalar
     scilab_fill_sub(UInt32, ScalarDouble, M_S, UInt32, Double, UInt32);
@@ -489,7 +488,7 @@ void fillSubtractFunction()
     scilab_fill_sub(ScalarUInt32, Int64, S_M, UInt32, Int64, UInt64);
     scilab_fill_sub(ScalarUInt32, UInt64, S_M, UInt32, UInt64, UInt64);
     scilab_fill_sub(ScalarUInt32, Bool, S_M, UInt32, Bool, UInt32);
-    scilab_fill_sub(ScalarUInt32, Empty, S_M, UInt32, Double, UInt32);
+    scilab_fill_sub(ScalarUInt32, Empty, S_E, UInt32, Double, UInt32);
 
     //Scalar - Scalar
     scilab_fill_sub(ScalarUInt32, ScalarDouble, S_S, UInt32, Double, UInt32);
@@ -515,7 +514,7 @@ void fillSubtractFunction()
     scilab_fill_sub(Int64, Int64, M_M, Int64, Int64, Int64);
     scilab_fill_sub(Int64, UInt64, M_M, Int64, UInt64, UInt64);
     scilab_fill_sub(Int64, Bool, M_M, Int64, Bool, Int64);
-    scilab_fill_sub(Int64, Empty, M_M, Int64, Double, Int64);
+    scilab_fill_sub(Int64, Empty, M_E, Int64, Double, Int64);
 
     //Matrix - Scalar
     scilab_fill_sub(Int64, ScalarDouble, M_S, Int64, Double, Int64);
@@ -540,7 +539,7 @@ void fillSubtractFunction()
     scilab_fill_sub(ScalarInt64, Int64, S_M, Int64, Int64, Int64);
     scilab_fill_sub(ScalarInt64, UInt64, S_M, Int64, UInt64, UInt64);
     scilab_fill_sub(ScalarInt64, Bool, S_M, Int64, Bool, Int64);
-    scilab_fill_sub(ScalarInt64, Empty, M_M, Int64, Double, Int64);
+    scilab_fill_sub(ScalarInt64, Empty, S_E, Int64, Double, Int64);
 
     //Scalar - Scalar
     scilab_fill_sub(ScalarInt64, ScalarDouble, S_S, Int64, Double, Int64);
@@ -566,7 +565,7 @@ void fillSubtractFunction()
     scilab_fill_sub(UInt64, Int64, M_M, UInt64, Int64, UInt64);
     scilab_fill_sub(UInt64, UInt64, M_M, UInt64, UInt64, UInt64);
     scilab_fill_sub(UInt64, Bool, M_M, UInt64, Bool, UInt64);
-    scilab_fill_sub(UInt64, Empty, M_M, UInt64, Double, UInt64);
+    scilab_fill_sub(UInt64, Empty, M_E, UInt64, Double, UInt64);
 
     //Matrix - Scalar
     scilab_fill_sub(UInt64, ScalarDouble, M_S, UInt64, Double, UInt64);
@@ -591,7 +590,7 @@ void fillSubtractFunction()
     scilab_fill_sub(ScalarUInt64, Int64, S_M, UInt64, Int64, UInt64);
     scilab_fill_sub(ScalarUInt64, UInt64, S_M, UInt64, UInt64, UInt64);
     scilab_fill_sub(ScalarUInt64, Bool, S_M, UInt64, Bool, UInt64);
-    scilab_fill_sub(ScalarUInt64, Empty, S_M, UInt64, Double, UInt64);
+    scilab_fill_sub(ScalarUInt64, Empty, S_E, UInt64, Double, UInt64);
 
     //Scalar - Scalar
     scilab_fill_sub(ScalarUInt64, ScalarDouble, S_S, UInt64, Double, UInt64);
@@ -617,7 +616,7 @@ void fillSubtractFunction()
     scilab_fill_sub(Bool, Int64, M_M, Bool, Int64, Int64);
     scilab_fill_sub(Bool, UInt64, M_M, Bool, UInt64, UInt64);
     scilab_fill_sub(Bool, Bool, M_M, Bool, Bool, Bool);
-    scilab_fill_sub(Bool, Empty, M_M, Bool, Double, Double);
+    scilab_fill_sub(Bool, Empty, M_E, Bool, Double, Double);
 
     //Matrix - Scalar
     scilab_fill_sub(Bool, ScalarDouble, M_S, Bool, Double, Double);
@@ -642,7 +641,7 @@ void fillSubtractFunction()
     scilab_fill_sub(ScalarBool, Int64, S_M, Bool, Int64, Int64);
     scilab_fill_sub(ScalarBool, UInt64, S_M, Bool, UInt64, UInt64);
     scilab_fill_sub(ScalarBool, Bool, S_M, Bool, Bool, Bool);
-    scilab_fill_sub(ScalarBool, Empty, M_M, Bool, Double, Double);
+    scilab_fill_sub(ScalarBool, Empty, S_E, Bool, Double, Double);
 
     //Scalar - Scalar
     scilab_fill_sub(ScalarBool, ScalarDouble, S_S, Bool, Double, Double);
@@ -845,7 +844,7 @@ InternalType* sub_M_M(T *_pL, U *_pR)
 
     O* pOut = new O(iDimsL, piDimsL);
 
-    sub(_pL->get(), (long long)_pL->getSize(), _pR->get(), pOut->get());
+    sub(_pL->get(), (size_t)_pL->getSize(), _pR->get(), pOut->get());
     return pOut;
 }
 
@@ -873,7 +872,7 @@ InternalType* sub_M_MC(T *_pL, U *_pR)
 
     O* pOut = new O(iDimsL, piDimsL, true);
 
-    sub(_pL->get(), (long long)_pL->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
+    sub(_pL->get(), (size_t)_pL->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -881,7 +880,7 @@ template<class T, class U, class O>
 InternalType* sub_M_S(T *_pL, U *_pR)
 {
     O* pOut = new O(_pL->getDims(), _pL->getDimsArray());
-    sub(_pL->get(), (long long)_pL->getSize(), _pR->get(0), pOut->get());
+    sub(_pL->get(), (size_t)_pL->getSize(), _pR->get(0), pOut->get());
     return pOut;
 }
 
@@ -889,7 +888,7 @@ template<class T, class U, class O>
 InternalType* sub_M_SC(T *_pL, U *_pR)
 {
     O* pOut = new O(_pL->getDims(), _pL->getDimsArray(), true);
-    sub(_pL->get(), (long long)_pL->getSize(), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    sub(_pL->get(), (size_t)_pL->getSize(), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -924,7 +923,7 @@ InternalType* sub_MC_M(T *_pL, U *_pR)
 
     O* pOut = new O(iDimsL, piDimsL, true);
 
-    sub(_pL->get(), _pL->getImg(), (long long)_pL->getSize(), _pR->get(), pOut->get(), pOut->getImg());
+    sub(_pL->get(), _pL->getImg(), (size_t)_pL->getSize(), _pR->get(), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -952,7 +951,7 @@ InternalType* sub_MC_MC(T *_pL, U *_pR)
 
     O* pOut = new O(iDimsL, piDimsL, true);
 
-    sub(_pL->get(), _pL->getImg(), (long long)_pL->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
+    sub(_pL->get(), _pL->getImg(), (size_t)_pL->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -960,7 +959,7 @@ template<class T, class U, class O>
 InternalType* sub_MC_S(T *_pL, U *_pR)
 {
     O* pOut = new O(_pL->getDims(), _pL->getDimsArray(), true);
-    sub(_pL->get(), _pL->getImg(), (long long)_pL->getSize(), _pR->get(0), pOut->get(), pOut->getImg());
+    sub(_pL->get(), _pL->getImg(), (size_t)_pL->getSize(), _pR->get(0), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -968,7 +967,7 @@ template<class T, class U, class O>
 InternalType* sub_MC_SC(T *_pL, U *_pR)
 {
     O* pOut = new O(_pL->getDims(), _pL->getDimsArray(), true);
-    sub(_pL->get(), _pL->getImg(), (long long)_pL->getSize(), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    sub(_pL->get(), _pL->getImg(), (size_t)_pL->getSize(), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -983,7 +982,7 @@ template<class T, class U, class O>
 InternalType* sub_S_M(T *_pL, U *_pR)
 {
     O* pOut = new O(_pR->getDims(), _pR->getDimsArray());
-    sub(_pL->get(0), _pR->getSize(), _pR->get(), pOut->get());
+    sub(_pL->get(0), (size_t)_pR->getSize(), _pR->get(), pOut->get());
     return pOut;
 }
 
@@ -991,7 +990,7 @@ template<class T, class U, class O>
 InternalType* sub_S_MC(T *_pL, U *_pR)
 {
     O* pOut = new O(_pR->getDims(), _pR->getDimsArray(), true);
-    sub(_pL->get(0), (long long)_pR->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
+    sub(_pL->get(0), (size_t)_pR->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -1007,7 +1006,7 @@ template<class T, class U, class O>
 InternalType* sub_S_SC(T *_pL, U *_pR)
 {
     O* pOut = new O(0.0, 0.0);
-    sub(_pL->get(), 1, _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    sub(_pL->get(), (size_t)1, _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -1024,7 +1023,7 @@ template<class T, class U, class O>
 InternalType* sub_SC_M(T *_pL, U *_pR)
 {
     O* pOut = new O(_pR->getDims(), _pR->getDimsArray(), true);
-    sub(_pL->get(0), _pL->getImg(0), (long long)_pR->getSize(), _pR->get(), pOut->get(), pOut->getImg());
+    sub(_pL->get(0), _pL->getImg(0), (size_t)_pR->getSize(), _pR->get(), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -1032,7 +1031,7 @@ template<class T, class U, class O>
 InternalType* sub_SC_MC(T *_pL, U *_pR)
 {
     O* pOut = new O(_pR->getDims(), _pR->getDimsArray(), true);
-    sub(_pL->get(0), _pL->getImg(0), (long long)_pR->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
+    sub(_pL->get(0), _pL->getImg(0), (size_t)_pR->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -1040,7 +1039,7 @@ template<class T, class U, class O>
 InternalType* sub_SC_S(T *_pL, U *_pR)
 {
     O* pOut = new O(0.0, 0.0);
-    sub(_pL->get(), _pL->getImg(), 1, _pR->get(0), pOut->get(), pOut->getImg());
+    sub(_pL->get(), _pL->getImg(), (size_t)1, _pR->get(0), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -1193,7 +1192,7 @@ InternalType* sub_IC_M(T *_pL, U *_pR)
         }
 
         int index = _pR->getIndex(piIndex);
-        sub(&dblLeftR, &dblLeftI, 1, pdblRight[index], pdblOutR + index, pdblOutI + index);
+        sub(&dblLeftR, &dblLeftI, (size_t)1, pdblRight[index], pdblOutR + index, pdblOutI + index);
     }
 
     return pOut;
@@ -1296,7 +1295,7 @@ template<class T, class U, class O> InternalType* sub_M_I(T *_pL, U *_pR)
         }
 
         int index = _pL->getIndex(piIndex);
-        sub(pdblLeft[index], 1, &dblRight, pdblOutR + index);
+        sub(pdblLeft[index], (size_t)1, &dblRight, pdblOutR + index);
     }
 
     return pOut;
@@ -1342,7 +1341,7 @@ template<class T, class U, class O> InternalType* sub_M_IC(T *_pL, U *_pR)
         }
 
         int index = _pL->getIndex(piIndex);
-        sub(pdblLeft[index], 1, &dblRightR, &dblRightI, pdblOutR + index, pdblOutI + index);
+        sub(pdblLeft[index], (size_t)1, &dblRightR, &dblRightI, pdblOutR + index, pdblOutI + index);
     }
 
     return pOut;
@@ -1384,7 +1383,7 @@ template<class T, class U, class O> InternalType* sub_MC_IC(T *_pL, U *_pR)
         }
 
         int index = _pL->getIndex(piIndex);
-        sub(pdblLeftR[index], pdblLeftI[index], 1, &dblRightR, &dblRightI, pdblOutR + index, pdblOutI + index);
+        sub(pdblLeftR[index], pdblLeftI[index], (size_t)1, &dblRightR, &dblRightI, pdblOutR + index, pdblOutI + index);
     }
 
     return pOut;
@@ -1421,7 +1420,7 @@ template<class T, class U, class O> InternalType* sub_I_IC(T *_pL, U *_pR)
 {
     O* pOut = types::Double::Identity(-1, -1);
     pOut->setComplex(true);
-    sub(_pL->get(), 1, _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    sub(_pL->get(), (size_t)1, _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
     return pOut;
 }
 
@@ -1789,7 +1788,7 @@ template<> InternalType* sub_M_M<Polynom, Double, Polynom>(Polynom* _pL, Double*
                 }
 
                 int index = _pL->getIndex(piIndex);
-                sub(pSPLeft[index]->get(0), pSPLeft[index]->getImg(0), 1, &dblRightR, &dblRightI, pSPOut[index]->get(), pSPOut[index]->getImg());
+                sub(pSPLeft[index]->get(0), pSPLeft[index]->getImg(0), (size_t)1, &dblRightR, &dblRightI, pSPOut[index]->get(), pSPOut[index]->getImg());
             }
         }
         else
@@ -1802,7 +1801,7 @@ template<> InternalType* sub_M_M<Polynom, Double, Polynom>(Polynom* _pL, Double*
                 }
 
                 int index = _pL->getIndex(piIndex);
-                sub(pSPLeft[index]->get(0), 1, &dblRightR, pSPOut[index]->get());
+                sub(pSPLeft[index]->get(0), (size_t)1, &dblRightR, pSPOut[index]->get());
             }
         }
         return pOut;
@@ -2063,7 +2062,7 @@ template<> InternalType* sub_IC_M<Double, Polynom, Polynom>(Double* _pL, Polynom
         }
 
         int index = _pR->getIndex(piIndex);
-        sub(&dblLeftR, &dblLeftI, 1, pSP[index]->get(0), pSPOut[index]->get(), pSPOut[index]->getImg());
+        sub(&dblLeftR, &dblLeftI, (size_t)1, pSP[index]->get(0), pSPOut[index]->get(), pSPOut[index]->getImg());
     }
 
     return pOut;
@@ -2112,8 +2111,8 @@ template<> InternalType* sub_IC_MC<Double, Polynom, Polynom>(Double* _pL, Polyno
 template<> InternalType* sub_M_M<Double, Polynom, Polynom>(Double* _pL, Polynom* _pR)
 {
     Polynom* pOut = NULL;
-    bool bComplex1 = _pR->isComplex();
-    bool bComplex2 = _pL->isComplex();
+    bool bComplex1 = _pL->isComplex();
+    bool bComplex2 = _pR->isComplex();
 
     double *pInDblR = _pL->getReal();
     double *pInDblI = _pL->getImg();
@@ -2175,11 +2174,20 @@ template<> InternalType* sub_M_M<Double, Polynom, Polynom>(Double* _pL, Polynom*
 
     if (_pL->isScalar())
     {
-        pOut = (Polynom*)_pR->clone();
+        if (bComplex2)
+        {
+            pOut = (Polynom*)opposite_MC<Polynom, Polynom>(_pR);
+        }
+        else
+        {
+            pOut = (Polynom*)opposite_M<Polynom, Polynom>(_pR);
+        }
+
+        int iSize = pOut->getSize();
 
         if (bComplex1 && bComplex2)
         {
-            for (int i = 0 ; i < pOut->getSize() ; i++)
+            for (int i = 0 ; i < iSize ; i++)
             {
                 SinglePoly *pSPOut   = pOut->get(i);
                 double *pOutPolyR    = pSPOut->get();
@@ -2189,10 +2197,10 @@ template<> InternalType* sub_M_M<Double, Polynom, Polynom>(Double* _pL, Polynom*
                 pOutPolyI[0] += pInDblI[0];
             }
         }
-        else if (bComplex2)
+        else if (bComplex1)
         {
             pOut->setComplex(true);
-            for (int i = 0 ; i < pOut->getSize() ; i++)
+            for (int i = 0 ; i < iSize ; i++)
             {
                 SinglePoly *pSPOut   = pOut->get(i);
                 double *pOutPolyR    = pSPOut->get();
@@ -2204,7 +2212,7 @@ template<> InternalType* sub_M_M<Double, Polynom, Polynom>(Double* _pL, Polynom*
         }
         else
         {
-            for (int i = 0 ; i < pOut->getSize() ; i++)
+            for (int i = 0 ; i < iSize ; i++)
             {
                 SinglePoly *pSPOut = pOut->get(i);
                 double *pOutPolyR  = pSPOut->get();
@@ -2239,7 +2247,15 @@ template<> InternalType* sub_M_M<Double, Polynom, Polynom>(Double* _pL, Polynom*
         }
     }
 
-    pOut = (Polynom*)_pR->clone();
+    if (bComplex2)
+    {
+        pOut = (Polynom*)opposite_MC<Polynom, Polynom>(_pR);
+    }
+    else
+    {
+        pOut = (Polynom*)opposite_M<Polynom, Polynom>(_pR);
+    }
+
     if (bComplex1 && bComplex2)
     {
         for (int i = 0 ; i < pOut->getSize() ; i++)
@@ -2252,7 +2268,7 @@ template<> InternalType* sub_M_M<Double, Polynom, Polynom>(Double* _pL, Polynom*
             pOutPolyI[0] += pInDblI[i];
         }
     }
-    else if (bComplex2)
+    else if (bComplex1)
     {
         pOut->setComplex(true);
         for (int i = 0 ; i < pOut->getSize() ; i++)
index fc6f368..8e921d6 100644 (file)
@@ -547,6 +547,93 @@ SinglePoly* SinglePoly::conjugate()
         return clone();
     }
 }
+
+SinglePoly* operator*(const SinglePoly& _lhs, const SinglePoly& _rhs)
+{
+    SinglePoly& lhs = const_cast<SinglePoly &>(_lhs);
+    SinglePoly& rhs = const_cast<SinglePoly &>(_rhs);
+    SinglePoly* pOut = NULL;
+
+    bool isComplexL = lhs.isComplex();
+    bool isComplexR = rhs.isComplex();
+    bool isComplexOut = isComplexL || isComplexR;
+
+    int iRankL = lhs.getRank();
+    int iRankR = rhs.getRank();
+    int iRankOut = lhs.getRank() + rhs.getRank();
+
+    double* pdblOutR = NULL;
+    double* pdblOutI = NULL;
+    double* pdblLR = lhs.get();
+    double* pdblLI = lhs.getImg();
+    double* pdblRR = rhs.get();
+    double* pdblRI = rhs.getImg();
+
+    if (isComplexOut)
+    {
+        pOut = new SinglePoly(&pdblOutR, &pdblOutI, iRankOut);
+        memset(pdblOutR, 0x00, sizeof(double) * (iRankOut + 1));
+        memset(pdblOutI, 0x00, sizeof(double) * (iRankOut + 1));
+    }
+    else
+    {
+        pOut = new SinglePoly(&pdblOutR, iRankOut);
+        memset(pdblOutR, 0x00, sizeof(double) * (iRankOut + 1));
+    }
+
+    if (isComplexL)
+    {
+        if (isComplexR)
+        {
+            for (int i = 0 ; i < iRankL + 1; ++i)
+            {
+                for (int j = 0 ; j < iRankR + 1; ++j)
+                {
+                    pdblOutR[i + j]  += pdblLR[i] * pdblRR[j] - pdblLI[i] * pdblRI[j];
+                    pdblOutI[i + j]  += pdblLI[i] * pdblRR[j] + pdblLR[i] * pdblRI[j];
+                }
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < iRankL + 1 ; ++i)
+            {
+                for (int j = 0 ; j < iRankR + 1 ; ++j)
+                {
+                    pdblOutR[i + j]  += pdblLR[i] * pdblRR[j];
+                    pdblOutI[i + j]  += pdblLI[i] * pdblRR[j];
+                }
+            }
+        }
+    }
+    else
+    {
+        if (isComplexR)
+        {
+            for (int i = 0 ; i < iRankL + 1 ; ++i)
+            {
+                for (int j = 0 ; j < iRankR + 1 ; ++j)
+                {
+                    pdblOutR[i + j]  += pdblLR[i] * pdblRR[j];
+                    pdblOutI[i + j]  += pdblLR[i] * pdblRI[j];
+                }
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < iRankL + 1 ; ++i)
+            {
+                for (int j = 0 ; j < iRankR + 1 ; ++j)
+                {
+                    pdblOutR[i + j]  += pdblLR[i] * pdblRR[j];
+                }
+            }
+        }
+    }
+
+    return pOut;
 }
+}
+
 
 
index 2ba76fc..27d2750 100644 (file)
@@ -5,6 +5,8 @@
 //  This file is distributed under the same license as the Scilab package.
 // ============================================================================
 // <-- JVM NOT MANDATORY -->
+s = %s;
+empty = [];
 r = 2;
 R = [1,2;3,4];
 R3(:,:,1) = R;
@@ -14,255 +16,391 @@ C = [1+2*%i,2+4*%i;3+6*%i,4+8*%i];
 C3(:,:,1) = C;
 C3(:,:,2) = C';
 e = eye();
-ei = (5+%i) * eye();
+ec = (5+%i) * eye();
 p = 1 + %s - %s**2;
 pc = 1 + %s - %s**2 + ( 2 - 3 * %s + 4 * %s**2 ) * %i;
 P = [2*p, -3*p;4*p,-5*p];
 PC = [2*pc, -3*pc;4*pc,-5*pc];
 SP = sparse([1,2;4,5;3,10],[1,2,3]);
-SPC = sparse([1,2;4,5;3,10],[1,2,3]) + sparse([1,2;4,5;3,10],[1,2,3]) * -4*%i;
-assert_checkequal((1:3) + 1, 2:4);
-assert_checkequal((1:3) + (4:6), [5 7 9]);
-assert_checkequal(1 + (1:3), 2:4);
-//[] + []
-assert_checkequal([] + [], []);
-//double + []
-//r + []
-assert_checkequal(r + [], r);
-//c + []
-assert_checkequal(c + [], c);
-//[] + double
-//[] + r
-assert_checkequal([] + r, r);
-//[] + c
-assert_checkequal([] + c, c);
-//DOUBLE + []
-//R + []
-assert_checkequal(R + [], R);
-//C + []
-assert_checkequal(C + [], C);
-//[] + DOUBLE
-//[] + R
-assert_checkequal([] + R, R);
-//[] + C
-assert_checkequal([] + C, C);
-// double + double
-//r + r
+SPC = sparse([1,2;4,5;3,10],[1,2,3]) * ( 1 + 4*%i);
+i8 = int8(-8);
+ui8 = uint8(8);
+I8 = int8([-8 -16 ; -24 -32]);
+UI8 = uint8([8 16 ; 24 32]);
+I16 = int16([-16 -32 ; -48 -64]);
+UI16 = uint16([16 32 ; 48 64]);
+i16 = int16(-16);
+ui16 = uint16(16);
+i32 = int32(-32);
+ui32 = uint32(32);
+I32 = int32([-32 -64 ; -96 -128]);
+UI32 = uint32([32 64 ; 96 128]);
+str = "string";
+STR = ["string1" "string2";"string3" "string4"];
+assert_checkequal(empty + empty, []);
+assert_checkequal(empty + r, 2);
+assert_checkequal(empty + c,  1+%i*2);
+assert_checkequal(empty + R, [1,2;3,4]);
+assert_checkequal(empty + C, [ 1+%i*2, 2+%i*4; 3+%i*6, 4+%i*8]);
+assert_checkequal(empty + e, eye());
+assert_checkequal(empty + ec, ( 5+%i)*eye());
+assert_checkequal(empty + p, 1+s-s^2);
+assert_checkequal(empty + pc, 1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(empty + P, [2+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-5-5*s+5*s^2]);
+assert_checkequal(empty + PC, [2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-5-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(empty + SP, sparse([1,2;3,10;4,5],[1;3;2],[4,10]));
+assert_checkequal(empty + SPC, sparse([1,2;3,10;4,5],[ 1+%i*4; 3+%i*12; 2+%i*8],[4,10]));
+assert_checkequal(empty + i8, int8(-8));
+assert_checkequal(empty + I8, int8([-8,-16;-24,-32]));
+assert_checkequal(empty + ui8, uint8(8));
+assert_checkequal(empty + UI8, uint8([8,16;24,32]));
+assert_checkequal(empty + i16, int16(-16));
+assert_checkequal(empty + I16, int16([-16,-32;-48,-64]));
+assert_checkequal(empty + ui16, uint16(16));
+assert_checkequal(empty + UI16, uint16([16,32;48,64]));
+assert_checkequal(empty + i32, int32(-32));
+assert_checkequal(empty + I32, int32([-32,-64;-96,-128]));
+assert_checkequal(empty + ui32, uint32(32));
+assert_checkequal(empty + UI32, uint32([32,64;96,128]));
+assert_checkequal(r + empty, 2);
 assert_checkequal(r + r, 4);
-//r + c
-assert_checkequal(r + c, 3+2*%i);
-//c + r
-assert_checkequal(c + r, 3+2*%i);
-//c + c
-assert_checkequal(c + c, 2+4*%i);
-//double + DOUBLE
-//r + R
+assert_checkequal(r + c,  3+%i*2);
 assert_checkequal(r + R, [3,4;5,6]);
-rR3ref(:,:,1) = [3,4;5,6];
-rR3ref(:,:,2) = [3,5;4,6];
-assert_checkequal(r + R3, rR3ref);
-//r + C
-assert_checkequal(r + C, [3+2*%i,4+4*%i;5+6*%i,6+8*%i]);
-rC3ref(:,:,1) = [3+2*%i,4+4*%i;5+6*%i,6+8*%i];
-rC3ref(:,:,2) = [3-2*%i,5-6*%i;4-4*%i,6-8*%i];
-assert_checkequal(r + C3, rC3ref);
-//c + R
-assert_checkequal(c + R, [2+2*%i,3+2*%i;4+2*%i,5+2*%i]);
-cR3ref(:,:,1) = [2+2*%i,3+2*%i;4+2*%i,5+2*%i];
-cR3ref(:,:,2) = [2+2*%i,4+2*%i;3+2*%i,5+2*%i];
-assert_checkequal(c + R3, cR3ref);
-//c + C
-assert_checkequal(c + C, [2+4*%i,3+6*%i;4+8*%i,5+10*%i]);
-cC3ref(:,:,1) = [2+4*%i,3+6*%i;4+8*%i,5+10*%i];
-cC3ref(:,:,2) = [2,4-4*%i;3-2*%i,5-6*%i];
-assert_checkequal(c + C3, cC3ref);
-//DOUBLE + double
-//R + r
+assert_checkequal(r + C, [ 3+%i*2, 4+%i*4; 5+%i*6, 6+%i*8]);
+assert_checkequal(r + e, 3);
+assert_checkequal(r + ec,  7+%i);
+assert_checkequal(r + p, 3+s-s^2);
+assert_checkequal(r + pc, 3+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(r + P, [4+2*s-2*s^2,-1-3*s+3*s^2;6+4*s-4*s^2,-3-5*s+5*s^2]);
+assert_checkequal(r + PC, [4+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-1-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;6+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-3-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(r + SP, [2,3,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,5;2,2,2,2,4,2,2,2,2,2]);
+assert_checkequal(r + SPC, [ 2, 3+%i*4, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2, 5+%i*12; 2, 2, 2, 2, 4+%i*8, 2, 2, 2, 2, 2]);
+assert_checkequal(r + i8, int8(-6));
+assert_checkequal(r + I8, int8([-6,-14;-22,-30]));
+assert_checkequal(r + ui8, uint8(10));
+assert_checkequal(r + UI8, uint8([10,18;26,34]));
+assert_checkequal(r + i16, int16(-14));
+assert_checkequal(r + I16, int16([-14,-30;-46,-62]));
+assert_checkequal(r + ui16, uint16(18));
+assert_checkequal(r + UI16, uint16([18,34;50,66]));
+assert_checkequal(r + i32, int32(-30));
+assert_checkequal(r + I32, int32([-30,-62;-94,-126]));
+assert_checkequal(r + ui32, uint32(34));
+assert_checkequal(r + UI32, uint32([34,66;98,130]));
+assert_checkequal(c + empty,  1+%i*2);
+assert_checkequal(c + r,  3+%i*2);
+assert_checkequal(c + c,  2+%i*4);
+assert_checkequal(c + R, [ 2+%i*2, 3+%i*2; 4+%i*2, 5+%i*2]);
+assert_checkequal(c + C, [ 2+%i*4, 3+%i*6; 4+%i*8, 5+%i*10]);
+assert_checkequal(c + e,  2+%i*2);
+assert_checkequal(c + ec,  6+%i*3);
+assert_checkequal(c + p, 2+%i*2+s-s^2);
+assert_checkequal(c + pc, 2+%i*4+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(c + P, [3+%i*2+2*s-2*s^2,-2+%i*2-3*s+3*s^2;5+%i*2+4*s-4*s^2,-4+%i*2-5*s+5*s^2]);
+assert_checkequal(c + PC, [3+%i*6+(2-%i*6)*s+(-2+%i*8)*s^2,-2-%i*4+(-3+%i*9)*s+(3-%i*12)*s^2;5+%i*10+(4-%i*12)*s+(-4+%i*16)*s^2,-4-%i*8+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(c + SP, [ 1+%i*2, 2+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 4+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 3+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
+assert_checkequal(c + SPC, [ 1+%i*2, 2+%i*6, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 4+%i*14; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 3+%i*10, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
+assert_checkequal(R + empty, [1,2;3,4]);
 assert_checkequal(R + r, [3,4;5,6]);
-R3rref(:,:,1) = [3,4;5,6];
-R3rref(:,:,2) = [3,5;4,6];
-assert_checkequal(R3 + r, R3rref);
-//R + c
-assert_checkequal(R + c, [2+2*%i,3+2*%i;4+2*%i,5+2*%i]);
-R3cref(:,:,1) = [2+2*%i,3+2*%i;4+2*%i,5+2*%i];
-R3cref(:,:,2) = [2+2*%i,4+2*%i;3+2*%i,5+2*%i];
-assert_checkequal(R3 + c, R3cref);
-//C + r
-assert_checkequal(C + r, [3+2*%i,4+4*%i;5+6*%i,6+8*%i]);
-C3rref(:,:,1) = [3+2*%i,4+4*%i;5+6*%i,6+8*%i];
-C3rref(:,:,2) = [3-2*%i,5-6*%i;4-4*%i,6-8*%i];
-assert_checkequal(C3 + r, C3rref);
-//c + c
-assert_checkequal(C + c, [2+4*%i,3+6*%i;4+8*%i,5+10*%i]);
-C3cref(:,:,1) = [2+4*%i,3+6*%i;4+8*%i,5+10*%i];
-C3cref(:,:,2) = [2,4-4*%i;3-2*%i,5-6*%i];
-assert_checkequal(C3 + c, C3cref);
-//DOUBLE + DOUBLE
-//R + R
+assert_checkequal(R + c, [ 2+%i*2, 3+%i*2; 4+%i*2, 5+%i*2]);
 assert_checkequal(R + R, [2,4;6,8]);
-R3R3ref(:,:,1) = [2,4;6,8];
-R3R3ref(:,:,2) = [2,6;4,8];
-assert_checkequal(R3 + R3, R3R3ref);
-//R + C
-assert_checkequal(R + C, [2+2*%i,4+4*%i;6+6*%i,8+8*%i]);
-R3C3ref(:,:,1) = [2+2*%i,4+4*%i;6+6*%i,8+8*%i];
-R3C3ref(:,:,2) = [2-2*%i,6-6*%i;4-4*%i,8-8*%i];
-assert_checkequal(R3 + C3, R3C3ref);
-//C + R
-assert_checkequal(C + R, [2+2*%i,4+4*%i;6+6*%i,8+8*%i]);
-C3R3ref(:,:,1) = [2+2*%i,4+4*%i;6+6*%i,8+8*%i];
-C3R3ref(:,:,2) = [2-2*%i,6-6*%i;4-4*%i,8-8*%i];
-assert_checkequal(C3 + R3, C3R3ref);
-//C + C
-assert_checkequal(C + C, [2+4*%i,4+8*%i;6+12*%i,8+16*%i]);
-C3C3ref(:,:,1) = [2+4*%i,4+8*%i;6+12*%i,8+16*%i];
-C3C3ref(:,:,2) = [2-4*%i,6-12*%i;4-8*%i,8-16*%i];
-assert_checkequal(C3 + C3, C3C3ref);
-//identity
-//e + R
-assert_checkequal(e + R, [2 2 ;3 5]);
-//R + e
-assert_checkequal(R + e, [2 2 ;3 5]);
-//e + C
-assert_checkequal(e + C, [2+2*%i,2+4*%i;3+6*%i,5+8*%i]);
-//C + e
-assert_checkequal(C + e, [2+2*%i,2+4*%i;3+6*%i,5+8*%i]);
-//e + r
+assert_checkequal(R + C, [ 2+%i*2, 4+%i*4; 6+%i*6, 8+%i*8]);
+assert_checkequal(R + e, [2,2;3,5]);
+assert_checkequal(R + ec, [ 6+%i, 2; 3, 9+%i]);
+assert_checkequal(R + p, [2+s-s^2,3+s-s^2;4+s-s^2,5+s-s^2]);
+assert_checkequal(R + pc, [2+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,3+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2;4+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,5+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2]);
+assert_checkequal(R + P, [3+2*s-2*s^2,-1-3*s+3*s^2;7+4*s-4*s^2,-1-5*s+5*s^2]);
+assert_checkequal(R + PC, [3+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-1-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;7+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-1-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(R + i8, int8([-7,-6;-5,-4]));
+assert_checkequal(R + I8, int8([-7,-14;-21,-28]));
+assert_checkequal(R + ui8, uint8([9,10;11,12]));
+assert_checkequal(R + UI8, uint8([9,18;27,36]));
+assert_checkequal(R + i16, int16([-15,-14;-13,-12]));
+assert_checkequal(R + I16, int16([-15,-30;-45,-60]));
+assert_checkequal(R + ui16, uint16([17,18;19,20]));
+assert_checkequal(R + UI16, uint16([17,34;51,68]));
+assert_checkequal(R + i32, int32([-31,-30;-29,-28]));
+assert_checkequal(R + I32, int32([-31,-62;-93,-124]));
+assert_checkequal(R + ui32, uint32([33,34;35,36]));
+assert_checkequal(R + UI32, uint32([33,66;99,132]));
+assert_checkequal(C + empty, [ 1+%i*2, 2+%i*4; 3+%i*6, 4+%i*8]);
+assert_checkequal(C + r, [ 3+%i*2, 4+%i*4; 5+%i*6, 6+%i*8]);
+assert_checkequal(C + c, [ 2+%i*4, 3+%i*6; 4+%i*8, 5+%i*10]);
+assert_checkequal(C + R, [ 2+%i*2, 4+%i*4; 6+%i*6, 8+%i*8]);
+assert_checkequal(C + C, [ 2+%i*4, 4+%i*8; 6+%i*12, 8+%i*16]);
+assert_checkequal(C + e, [ 2+%i*2, 2+%i*4; 3+%i*6, 5+%i*8]);
+assert_checkequal(C + ec, [ 6+%i*3, 2+%i*4; 3+%i*6, 9+%i*9]);
+assert_checkequal(C + p, [2+%i*2+s-s^2,3+%i*4+s-s^2;4+%i*6+s-s^2,5+%i*8+s-s^2]);
+assert_checkequal(C + pc, [2+%i*4+(1-%i*3)*s+(-1+%i*4)*s^2,3+%i*6+(1-%i*3)*s+(-1+%i*4)*s^2;4+%i*8+(1-%i*3)*s+(-1+%i*4)*s^2,5+%i*10+(1-%i*3)*s+(-1+%i*4)*s^2]);
+assert_checkequal(C + P, [3+%i*2+2*s-2*s^2,-1+%i*4-3*s+3*s^2;7+%i*6+4*s-4*s^2,-1+%i*8-5*s+5*s^2]);
+assert_checkequal(C + PC, [3+%i*6+(2-%i*6)*s+(-2+%i*8)*s^2,-1-%i*2+(-3+%i*9)*s+(3-%i*12)*s^2;7+%i*14+(4-%i*12)*s+(-4+%i*16)*s^2,-1-%i*2+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(e + empty, eye());
 assert_checkequal(e + r, 3);
-//r + e
-assert_checkequal(r + e, 3);
-//e + c
-assert_checkequal(e + c, 2+2*%i);
-//c + e
-assert_checkequal(c + e, 2+2*%i);
-//e + []
-assert_checkequal(e + [], e);
-//[] + e
-assert_checkequal([] + e, e);
-//e + e
-assert_checkequal(e + e, 2* eye());
-//e + ei
-assert_checkequal(e + ei, (6+%i) * eye());
-//identity complex
-//ei + R
-assert_checkequal(ei + R, [6+%i,2;3,9+%i]);
-//R + ei
-assert_checkequal(R + ei, [6+%i,2;3,9+%i]);
-//ei + C
-assert_checkequal(ei + C, [6+3*%i,2+4*%i;3+6*%i,9+9*%i]);
-//C + ei
-assert_checkequal(C + ei, [6+3*%i,2+4*%i;3+6*%i,9+9*%i]);
-//ei + r
-assert_checkequal(ei + r, 7 + %i);
-//r + ei
-assert_checkequal(r + ei, 7 + %i);
-//ei + c
-assert_checkequal(ei + c, 6+3*%i);
-//c + ei
-assert_checkequal(c + ei, 6+3*%i);
-//ei + []
-assert_checkequal(ei + [], ei);
-//[] + ei
-assert_checkequal([] + ei, ei);
-//ei + e
-assert_checkequal(ei + e, (6+%i) * eye());
-//ei + ei
-assert_checkequal(ei + ei, (10+2*%i) * eye());
-//poly
-//p + []
-assert_checkequal(p + [], p);
-//[] + p
-assert_checkequal([] + p, p);
-//pc + []
-assert_checkequal(pc + [], pc);
-//[] + pc
-assert_checkequal([] + pc, pc);
-//P + []
-assert_checkequal(P + [], P);
-//[] + P
-assert_checkequal([] + P, P);
-//PC + []
-assert_checkequal(PC + [], PC);
-//[] + PC
-assert_checkequal([] + PC, PC);
-//p + r
-assert_checkequal(p + r, 3+%s-%s**2);
-//r + p
-assert_checkequal(r + p, 3+%s-%s**2);
-//p + c
-assert_checkequal(p + c, 2+%s-%s**2 + 2*%i);
-//c + p
-assert_checkequal(c + p, 2+%s-%s**2 + 2*%i);
-//p + R
-assert_checkequal(p + R, [2+%s-%s**2,3+%s-%s**2;4+%s-%s**2,5+%s-%s**2]);
-//R + p
-assert_checkequal(R + p, [2+%s-%s**2,3+%s-%s**2;4+%s-%s**2,5+%s-%s**2]);
-//p + C
-assert_checkequal(p + C, [2+%s-%s**2+2*%i,3+%s-%s**2+4*%i;4+%s-%s**2+6*%i,5+%s-%s**2+8*%i]);
-//C + p
-assert_checkequal(C + p, [2+%s-%s**2+2*%i,3+%s-%s**2+4*%i;4+%s-%s**2+6*%i,5+%s-%s**2+8*%i]);
-//p + p
-assert_checkequal(p + p, 2 + 2*%s - 2*%s**2);
-//p + pc
-assert_checkequal(p + pc, 2 + 2*%s - 2*%s**2 + (2-3*%s+4*%s**2) * %i);
-//pc + p
-assert_checkequal(pc + p, 2 + 2*%s - 2*%s**2 + (2-3*%s+4*%s**2) * %i);
-//pc + pc
-assert_checkequal(pc + pc, 2 + 2*%s - 2*%s**2 + (4-6*%s+8*%s**2) * %i);
-//P + p
-assert_checkequal(P + p, [3+3*%s-3*%s**2,-2-2*%s+2*%s**2;5+5*%s-5*%s**2,-4-4*%s+4*%s**2]);
-//p + P
-assert_checkequal(p + P, [3+3*%s-3*%s**2,-2-2*%s+2*%s**2;5+5*%s-5*%s**2,-4-4*%s+4*%s**2]);
-//P + pc
-assert_checkequal(P + pc, [3+3*%s-3*%s**2+(2-3*%s+4*%s**2)*%i,-2-2*%s+2*%s**2+(2-3*%s+4*%s**2)*%i;5+5*%s-5*%s**2+(2-3*%s+4*%s**2)*%i,-4-4*%s+4*%s**2+(2-3*%s+4*%s**2)*%i]);
-//pc + P
-assert_checkequal(pc + P, [3+3*%s-3*%s**2+(2-3*%s+4*%s**2)*%i,-2-2*%s+2*%s**2+(2-3*%s+4*%s**2)*%i;5+5*%s-5*%s**2+(2-3*%s+4*%s**2)*%i,-4-4*%s+4*%s**2+(2-3*%s+4*%s**2)*%i]);
-//PC + p
-assert_checkequal(PC + p, [3+3*%s-3*%s**2+(4-6*%s+8*%s**2)*%i,-2-2*%s+2*%s**2+(-6+9*%s-12*%s**2)*%i;5+5*%s-5*%s**2+(8-12*%s+16*%s**2)*%i,-4-4*%s+4*%s**2+(-10+15*%s-20*%s**2)*%i]);
-//p + PC
-assert_checkequal(p + PC, [3+3*%s-3*%s**2+(4-6*%s+8*%s**2)*%i,-2-2*%s+2*%s**2+(-6+9*%s-12*%s**2)*%i;5+5*%s-5*%s**2+(8-12*%s+16*%s**2)*%i,-4-4*%s+4*%s**2+(-10+15*%s-20*%s**2)*%i]);
-//PC + pc
-assert_checkequal(PC + pc, [3+3*%s-3*%s**2+(6-9*%s+12*%s**2)*%i,-2-2*%s+2*%s**2+(-4+6*%s-8*%s**2)*%i;5+5*%s-5*%s**2+(10-15*%s+20*%s**2)*%i,-4-4*%s+4*%s**2+(-8+12*%s-16*%s**2)*%i]);
-//pc + PC
-assert_checkequal(pc + PC, [3+3*%s-3*%s**2+(6-9*%s+12*%s**2)*%i,-2-2*%s+2*%s**2+(-4+6*%s-8*%s**2)*%i;5+5*%s-5*%s**2+(10-15*%s+20*%s**2)*%i,-4-4*%s+4*%s**2+(-8+12*%s-16*%s**2)*%i]);
-//P + P
-assert_checkequal(P + P, [4+4*%s-4*%s**2,-6-6*%s+6*%s**2;8+8*%s-8*%s**2,-10-10*%s+10*%s**2]);
-//P + PC
-assert_checkequal(P + PC, [4+4*%s-4*%s**2+(4-6*%s+8*%s**2)*%i,-6-6*%s+6*%s**2+(-6+9*%s-12*%s**2)*%i;8+8*%s-8*%s**2+(8-12*%s+16*%s**2)*%i,-10-10*%s+10*%s**2+(-10+15*%s-20*%s**2)*%i]);
-//PC + P
-assert_checkequal(PC + P, [4+4*%s-4*%s**2+(4-6*%s+8*%s**2)*%i,-6-6*%s+6*%s**2+(-6+9*%s-12*%s**2)*%i;8+8*%s-8*%s**2+(8-12*%s+16*%s**2)*%i,-10-10*%s+10*%s**2+(-10+15*%s-20*%s**2)*%i]);
-//PC + PC
-assert_checkequal(PC + PC, [4+4*%s-4*%s**2+(8-12*%s+16*%s**2)*%i,-6-6*%s+6*%s**2+(-12+18*%s-24*%s**2)*%i;8+8*%s-8*%s**2+(16-24*%s+32*%s**2)*%i,-10-10*%s+10*%s**2+(-20+30*%s-40*%s**2)*%i]);
-//sparse
-//SP + []
-assert_checkequal(SP + [], SP);
-//[] + SP
-assert_checkequal([] + SP, SP);
-//SPC + []
-assert_checkequal(SPC + [], SPC);
-//[] + SPC
-assert_checkequal([] + SPC, SPC);
-//SP + r
-assert_checkequal(SP + r, full(SP) + r);
-//r + SP
-assert_checkequal(r + SP, full(SP) + r);
-//SP + c
-assert_checkequal(SP + c, full(SP) + c);
-//c + SP
-assert_checkequal(c + SP, full(SP) + c);
-//SPC + r
-assert_checkequal(SPC + r, full(SPC) + r);
-//r + SPC
-assert_checkequal(r + SPC, full(SPC) + r);
-//SPC + c
-assert_checkequal(SPC + c, full(SPC) + c);
-//c + SPC
-assert_checkequal(c + SPC, full(SPC) + c);
-//SP + SP
-assert_checkequal(SP + SP, sparse(full(SP) + full(SP)));
-//SP + SPC
-assert_checkequal(SP + SPC, sparse(full(SP) + full(SPC)));
-//SPC + SP
-assert_checkequal(SPC + SP, sparse(full(SPC) + full(SP)));
-//SPC + SPC
-assert_checkequal(SPC + SPC, sparse(full(SPC) + full(SPC)));
+assert_checkequal(e + c,  2+%i*2);
+assert_checkequal(e + R, [2,2;3,5]);
+assert_checkequal(e + C, [ 2+%i*2, 2+%i*4; 3+%i*6, 5+%i*8]);
+assert_checkequal(e + e, (2)*eye());
+assert_checkequal(e + ec, ( 6+%i)*eye());
+assert_checkequal(e + p, 2+s-s^2);
+assert_checkequal(e + pc, 2+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(e + P, [3+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-4-5*s+5*s^2]);
+assert_checkequal(e + PC, [3+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-4-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(e + SP, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[1;1;1;1;3;1;2],[4,10]));
+assert_checkequal(e + SPC, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 1; 1+%i*4; 1; 1; 3+%i*12; 1; 2+%i*8],[4,10]));
+assert_checkequal(ec + empty, ( 5+%i)*eye());
+assert_checkequal(ec + r,  7+%i);
+assert_checkequal(ec + c,  6+%i*3);
+assert_checkequal(ec + R, [ 6+%i, 2; 3, 9+%i]);
+assert_checkequal(ec + C, [ 6+%i*3, 2+%i*4; 3+%i*6, 9+%i*9]);
+assert_checkequal(ec + e, ( 6+%i)*eye());
+assert_checkequal(ec + ec, ( 10+%i*2)*eye());
+assert_checkequal(ec + p, 6+%i+s-s^2);
+assert_checkequal(ec + pc, 6+%i*3+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(ec + P, [7+%i+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,%i-5*s+5*s^2]);
+assert_checkequal(ec + PC, [7+%i*5+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-%i*9+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(ec + SP, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i; 1; 5+%i; 5+%i; 3; 5+%i; 2],[4,10]));
+assert_checkequal(ec + SPC, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i; 1+%i*4; 5+%i; 5+%i; 3+%i*12; 5+%i; 2+%i*8],[4,10]));
+assert_checkequal(p + empty, 1+s-s^2);
+assert_checkequal(p + r, 3+s-s^2);
+assert_checkequal(p + c, 2+%i*2+s-s^2);
+assert_checkequal(p + R, [2+s-s^2,3+s-s^2;4+s-s^2,5+s-s^2]);
+assert_checkequal(p + C, [2+%i*2+s-s^2,3+%i*4+s-s^2;4+%i*6+s-s^2,5+%i*8+s-s^2]);
+assert_checkequal(p + e, 2+s-s^2);
+assert_checkequal(p + ec, 6+%i+s-s^2);
+assert_checkequal(p + p, 2+2*s-2*s^2);
+assert_checkequal(p + pc, 2+%i*2+(2-%i*3)*s+(-2+%i*4)*s^2);
+assert_checkequal(p + P, [3+3*s-3*s^2,-2-2*s+2*s^2;5+5*s-5*s^2,-4-4*s+4*s^2]);
+assert_checkequal(p + PC, [3+%i*4+(3-%i*6)*s+(-3+%i*8)*s^2,-2-%i*6+(-2+%i*9)*s+(2-%i*12)*s^2;5+%i*8+(5-%i*12)*s+(-5+%i*16)*s^2,-4-%i*10+(-4+%i*15)*s+(4-%i*20)*s^2]);
+assert_checkequal(pc + empty, 1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc + r, 3+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc + c, 2+%i*4+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc + R, [2+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,3+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2;4+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,5+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2]);
+assert_checkequal(pc + C, [2+%i*4+(1-%i*3)*s+(-1+%i*4)*s^2,3+%i*6+(1-%i*3)*s+(-1+%i*4)*s^2;4+%i*8+(1-%i*3)*s+(-1+%i*4)*s^2,5+%i*10+(1-%i*3)*s+(-1+%i*4)*s^2]);
+assert_checkequal(pc + e, 2+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc + ec, 6+%i*3+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc + p, 2+%i*2+(2-%i*3)*s+(-2+%i*4)*s^2);
+assert_checkequal(pc + pc, 2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2);
+assert_checkequal(pc + P, [3+%i*2+(3-%i*3)*s+(-3+%i*4)*s^2,-2+%i*2+(-2-%i*3)*s+(2+%i*4)*s^2;5+%i*2+(5-%i*3)*s+(-5+%i*4)*s^2,-4+%i*2+(-4-%i*3)*s+(4+%i*4)*s^2]);
+assert_checkequal(pc + PC, [3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2,-2-%i*4+(-2+%i*6)*s+(2-%i*8)*s^2;5+%i*10+(5-%i*15)*s+(-5+%i*20)*s^2,-4-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2]);
+assert_checkequal(P + empty, [2+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-5-5*s+5*s^2]);
+assert_checkequal(P + r, [4+2*s-2*s^2,-1-3*s+3*s^2;6+4*s-4*s^2,-3-5*s+5*s^2]);
+assert_checkequal(P + c, [3+%i*2+2*s-2*s^2,-2+%i*2-3*s+3*s^2;5+%i*2+4*s-4*s^2,-4+%i*2-5*s+5*s^2]);
+assert_checkequal(P + R, [3+2*s-2*s^2,-1-3*s+3*s^2;7+4*s-4*s^2,-1-5*s+5*s^2]);
+assert_checkequal(P + C, [3+%i*2+2*s-2*s^2,-1+%i*4-3*s+3*s^2;7+%i*6+4*s-4*s^2,-1+%i*8-5*s+5*s^2]);
+assert_checkequal(P + e, [3+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-4-5*s+5*s^2]);
+assert_checkequal(P + ec, [7+%i+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,%i-5*s+5*s^2]);
+assert_checkequal(P + p, [3+3*s-3*s^2,-2-2*s+2*s^2;5+5*s-5*s^2,-4-4*s+4*s^2]);
+assert_checkequal(P + pc, [3+%i*2+(3-%i*3)*s+(-3+%i*4)*s^2,-2+%i*2+(-2-%i*3)*s+(2+%i*4)*s^2;5+%i*2+(5-%i*3)*s+(-5+%i*4)*s^2,-4+%i*2+(-4-%i*3)*s+(4+%i*4)*s^2]);
+assert_checkequal(P + P, [4+4*s-4*s^2,-6-6*s+6*s^2;8+8*s-8*s^2,-10-10*s+10*s^2]);
+assert_checkequal(P + PC, [4+%i*4+(4-%i*6)*s+(-4+%i*8)*s^2,-6-%i*6+(-6+%i*9)*s+(6-%i*12)*s^2;8+%i*8+(8-%i*12)*s+(-8+%i*16)*s^2,-10-%i*10+(-10+%i*15)*s+(10-%i*20)*s^2]);
+assert_checkequal(PC + empty, [2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-5-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + r, [4+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-1-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;6+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-3-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + c, [3+%i*6+(2-%i*6)*s+(-2+%i*8)*s^2,-2-%i*4+(-3+%i*9)*s+(3-%i*12)*s^2;5+%i*10+(4-%i*12)*s+(-4+%i*16)*s^2,-4-%i*8+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + R, [3+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-1-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;7+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-1-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + C, [3+%i*6+(2-%i*6)*s+(-2+%i*8)*s^2,-1-%i*2+(-3+%i*9)*s+(3-%i*12)*s^2;7+%i*14+(4-%i*12)*s+(-4+%i*16)*s^2,-1-%i*2+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + e, [3+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-4-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + ec, [7+%i*5+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-%i*9+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + p, [3+%i*4+(3-%i*6)*s+(-3+%i*8)*s^2,-2-%i*6+(-2+%i*9)*s+(2-%i*12)*s^2;5+%i*8+(5-%i*12)*s+(-5+%i*16)*s^2,-4-%i*10+(-4+%i*15)*s+(4-%i*20)*s^2]);
+assert_checkequal(PC + pc, [3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2,-2-%i*4+(-2+%i*6)*s+(2-%i*8)*s^2;5+%i*10+(5-%i*15)*s+(-5+%i*20)*s^2,-4-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2]);
+assert_checkequal(PC + P, [4+%i*4+(4-%i*6)*s+(-4+%i*8)*s^2,-6-%i*6+(-6+%i*9)*s+(6-%i*12)*s^2;8+%i*8+(8-%i*12)*s+(-8+%i*16)*s^2,-10-%i*10+(-10+%i*15)*s+(10-%i*20)*s^2]);
+assert_checkequal(PC + PC, [4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-6-%i*12+(-6+%i*18)*s+(6-%i*24)*s^2;8+%i*16+(8-%i*24)*s+(-8+%i*32)*s^2,-10-%i*20+(-10+%i*30)*s+(10-%i*40)*s^2]);
+assert_checkequal(SP + empty, sparse([1,2;3,10;4,5],[1;3;2],[4,10]));
+assert_checkequal(SP + r, [2,3,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,5;2,2,2,2,4,2,2,2,2,2]);
+assert_checkequal(SP + c, [ 1+%i*2, 2+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 4+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 3+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
+assert_checkequal(SP + e, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[1;1;1;1;3;1;2],[4,10]));
+assert_checkequal(SP + ec, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i; 1; 5+%i; 5+%i; 3; 5+%i; 2],[4,10]));
+assert_checkequal(SP + SP, sparse([1,2;3,10;4,5],[2;6;4],[4,10]));
+assert_checkequal(SP + SPC, sparse([1,2;3,10;4,5],[ 2+%i*4; 6+%i*12; 4+%i*8],[4,10]));
+assert_checkequal(SPC + empty, sparse([1,2;3,10;4,5],[ 1+%i*4; 3+%i*12; 2+%i*8],[4,10]));
+assert_checkequal(SPC + r, [ 2, 3+%i*4, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2, 5+%i*12; 2, 2, 2, 2, 4+%i*8, 2, 2, 2, 2, 2]);
+assert_checkequal(SPC + c, [ 1+%i*2, 2+%i*6, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 4+%i*14; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 3+%i*10, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
+assert_checkequal(SPC + e, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 1; 1+%i*4; 1; 1; 3+%i*12; 1; 2+%i*8],[4,10]));
+assert_checkequal(SPC + ec, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i; 1+%i*4; 5+%i; 5+%i; 3+%i*12; 5+%i; 2+%i*8],[4,10]));
+assert_checkequal(SPC + SP, sparse([1,2;3,10;4,5],[ 2+%i*4; 6+%i*12; 4+%i*8],[4,10]));
+assert_checkequal(SPC + SPC, sparse([1,2;3,10;4,5],[ 2+%i*8; 6+%i*24; 4+%i*16],[4,10]));
+assert_checkequal(i8 + empty, int8(-8));
+assert_checkequal(i8 + r, int8(-6));
+assert_checkequal(i8 + R, int8([-7,-6;-5,-4]));
+assert_checkequal(i8 + i8, int8(-16));
+assert_checkequal(i8 + I8, int8([-16,-24;-32,-40]));
+assert_checkequal(i8 + ui8, uint8(0));
+assert_checkequal(i8 + UI8, uint8([0,8;16,24]));
+assert_checkequal(i8 + i16, int16(-24));
+assert_checkequal(i8 + I16, int16([-24,-40;-56,-72]));
+assert_checkequal(i8 + ui16, uint16(8));
+assert_checkequal(i8 + UI16, uint16([8,24;40,56]));
+assert_checkequal(i8 + i32, int32(-40));
+assert_checkequal(i8 + I32, int32([-40,-72;-104,-136]));
+assert_checkequal(i8 + ui32, uint32(24));
+assert_checkequal(i8 + UI32, uint32([24,56;88,120]));
+assert_checkequal(I8 + empty, int8([-8,-16;-24,-32]));
+assert_checkequal(I8 + r, int8([-6,-14;-22,-30]));
+assert_checkequal(I8 + R, int8([-7,-14;-21,-28]));
+assert_checkequal(I8 + i8, int8([-16,-24;-32,-40]));
+assert_checkequal(I8 + I8, int8([-16,-32;-48,-64]));
+assert_checkequal(I8 + ui8, uint8([0,248;240,232]));
+assert_checkequal(I8 + UI8, uint8([0,0;0,0]));
+assert_checkequal(I8 + i16, int16([-24,-32;-40,-48]));
+assert_checkequal(I8 + I16, int16([-24,-48;-72,-96]));
+assert_checkequal(I8 + ui16, uint16([8,0;65528,65520]));
+assert_checkequal(I8 + UI16, uint16([8,16;24,32]));
+assert_checkequal(I8 + i32, int32([-40,-48;-56,-64]));
+assert_checkequal(I8 + I32, int32([-40,-80;-120,-160]));
+assert_checkequal(I8 + ui32, uint32([24,16;8,0]));
+assert_checkequal(I8 + UI32, uint32([24,48;72,96]));
+assert_checkequal(ui8 + empty, uint8(8));
+assert_checkequal(ui8 + r, uint8(10));
+assert_checkequal(ui8 + R, uint8([9,10;11,12]));
+assert_checkequal(ui8 + i8, uint8(0));
+assert_checkequal(ui8 + I8, uint8([0,248;240,232]));
+assert_checkequal(ui8 + ui8, uint8(16));
+assert_checkequal(ui8 + UI8, uint8([16,24;32,40]));
+assert_checkequal(ui8 + i16, uint16(65528));
+assert_checkequal(ui8 + I16, uint16([65528,65512;65496,65480]));
+assert_checkequal(ui8 + ui16, uint16(24));
+assert_checkequal(ui8 + UI16, uint16([24,40;56,72]));
+assert_checkequal(ui8 + i32, uint32(4294967272));
+assert_checkequal(ui8 + I32, uint32([4294967272,4294967240;4294967208,4294967176]));
+assert_checkequal(ui8 + ui32, uint32(40));
+assert_checkequal(ui8 + UI32, uint32([40,72;104,136]));
+assert_checkequal(UI8 + empty, uint8([8,16;24,32]));
+assert_checkequal(UI8 + r, uint8([10,18;26,34]));
+assert_checkequal(UI8 + R, uint8([9,18;27,36]));
+assert_checkequal(UI8 + i8, uint8([0,8;16,24]));
+assert_checkequal(UI8 + I8, uint8([0,0;0,0]));
+assert_checkequal(UI8 + ui8, uint8([16,24;32,40]));
+assert_checkequal(UI8 + UI8, uint8([16,32;48,64]));
+assert_checkequal(UI8 + i16, uint16([65528,0;8,16]));
+assert_checkequal(UI8 + I16, uint16([65528,65520;65512,65504]));
+assert_checkequal(UI8 + ui16, uint16([24,32;40,48]));
+assert_checkequal(UI8 + UI16, uint16([24,48;72,96]));
+assert_checkequal(UI8 + i32, uint32([4294967272,4294967280;4294967288,0]));
+assert_checkequal(UI8 + I32, uint32([4294967272,4294967248;4294967224,4294967200]));
+assert_checkequal(UI8 + ui32, uint32([40,48;56,64]));
+assert_checkequal(UI8 + UI32, uint32([40,80;120,160]));
+assert_checkequal(i16 + empty, int16(-16));
+assert_checkequal(i16 + r, int16(-14));
+assert_checkequal(i16 + R, int16([-15,-14;-13,-12]));
+assert_checkequal(i16 + i8, int16(-24));
+assert_checkequal(i16 + I8, int16([-24,-32;-40,-48]));
+assert_checkequal(i16 + ui8, uint16(65528));
+assert_checkequal(i16 + UI8, uint16([65528,0;8,16]));
+assert_checkequal(i16 + i16, int16(-32));
+assert_checkequal(i16 + I16, int16([-32,-48;-64,-80]));
+assert_checkequal(i16 + ui16, uint16(0));
+assert_checkequal(i16 + UI16, uint16([0,16;32,48]));
+assert_checkequal(i16 + i32, int32(-48));
+assert_checkequal(i16 + I32, int32([-48,-80;-112,-144]));
+assert_checkequal(i16 + ui32, uint32(16));
+assert_checkequal(i16 + UI32, uint32([16,48;80,112]));
+assert_checkequal(I16 + empty, int16([-16,-32;-48,-64]));
+assert_checkequal(I16 + r, int16([-14,-30;-46,-62]));
+assert_checkequal(I16 + R, int16([-15,-30;-45,-60]));
+assert_checkequal(I16 + i8, int16([-24,-40;-56,-72]));
+assert_checkequal(I16 + I8, int16([-24,-48;-72,-96]));
+assert_checkequal(I16 + ui8, uint16([65528,65512;65496,65480]));
+assert_checkequal(I16 + UI8, uint16([65528,65520;65512,65504]));
+assert_checkequal(I16 + i16, int16([-32,-48;-64,-80]));
+assert_checkequal(I16 + I16, int16([-32,-64;-96,-128]));
+assert_checkequal(I16 + ui16, uint16([0,65520;65504,65488]));
+assert_checkequal(I16 + UI16, uint16([0,0;0,0]));
+assert_checkequal(I16 + i32, int32([-48,-64;-80,-96]));
+assert_checkequal(I16 + I32, int32([-48,-96;-144,-192]));
+assert_checkequal(I16 + ui32, uint32([16,0;4294967280,4294967264]));
+assert_checkequal(I16 + UI32, uint32([16,32;48,64]));
+assert_checkequal(ui16 + empty, uint16(16));
+assert_checkequal(ui16 + r, uint16(18));
+assert_checkequal(ui16 + R, uint16([17,18;19,20]));
+assert_checkequal(ui16 + i8, uint16(8));
+assert_checkequal(ui16 + I8, uint16([8,0;65528,65520]));
+assert_checkequal(ui16 + ui8, uint16(24));
+assert_checkequal(ui16 + UI8, uint16([24,32;40,48]));
+assert_checkequal(ui16 + i16, uint16(0));
+assert_checkequal(ui16 + I16, uint16([0,65520;65504,65488]));
+assert_checkequal(ui16 + ui16, uint16(32));
+assert_checkequal(ui16 + UI16, uint16([32,48;64,80]));
+assert_checkequal(ui16 + i32, uint32(4294967280));
+assert_checkequal(ui16 + I32, uint32([4294967280,4294967248;4294967216,4294967184]));
+assert_checkequal(ui16 + ui32, uint32(48));
+assert_checkequal(ui16 + UI32, uint32([48,80;112,144]));
+assert_checkequal(UI16 + empty, uint16([16,32;48,64]));
+assert_checkequal(UI16 + r, uint16([18,34;50,66]));
+assert_checkequal(UI16 + R, uint16([17,34;51,68]));
+assert_checkequal(UI16 + i8, uint16([8,24;40,56]));
+assert_checkequal(UI16 + I8, uint16([8,16;24,32]));
+assert_checkequal(UI16 + ui8, uint16([24,40;56,72]));
+assert_checkequal(UI16 + UI8, uint16([24,48;72,96]));
+assert_checkequal(UI16 + i16, uint16([0,16;32,48]));
+assert_checkequal(UI16 + I16, uint16([0,0;0,0]));
+assert_checkequal(UI16 + ui16, uint16([32,48;64,80]));
+assert_checkequal(UI16 + UI16, uint16([32,64;96,128]));
+assert_checkequal(UI16 + i32, uint32([4294967280,0;16,32]));
+assert_checkequal(UI16 + I32, uint32([4294967280,4294967264;4294967248,4294967232]));
+assert_checkequal(UI16 + ui32, uint32([48,64;80,96]));
+assert_checkequal(UI16 + UI32, uint32([48,96;144,192]));
+assert_checkequal(i32 + empty, int32(-32));
+assert_checkequal(i32 + r, int32(-30));
+assert_checkequal(i32 + R, int32([-31,-30;-29,-28]));
+assert_checkequal(i32 + i8, int32(-40));
+assert_checkequal(i32 + I8, int32([-40,-48;-56,-64]));
+assert_checkequal(i32 + ui8, uint32(4294967272));
+assert_checkequal(i32 + UI8, uint32([4294967272,4294967280;4294967288,0]));
+assert_checkequal(i32 + i16, int32(-48));
+assert_checkequal(i32 + I16, int32([-48,-64;-80,-96]));
+assert_checkequal(i32 + ui16, uint32(4294967280));
+assert_checkequal(i32 + UI16, uint32([4294967280,0;16,32]));
+assert_checkequal(i32 + i32, int32(-64));
+assert_checkequal(i32 + I32, int32([-64,-96;-128,-160]));
+assert_checkequal(i32 + ui32, uint32(0));
+assert_checkequal(i32 + UI32, uint32([0,32;64,96]));
+assert_checkequal(I32 + empty, int32([-32,-64;-96,-128]));
+assert_checkequal(I32 + r, int32([-30,-62;-94,-126]));
+assert_checkequal(I32 + R, int32([-31,-62;-93,-124]));
+assert_checkequal(I32 + i8, int32([-40,-72;-104,-136]));
+assert_checkequal(I32 + I8, int32([-40,-80;-120,-160]));
+assert_checkequal(I32 + ui8, uint32([4294967272,4294967240;4294967208,4294967176]));
+assert_checkequal(I32 + UI8, uint32([4294967272,4294967248;4294967224,4294967200]));
+assert_checkequal(I32 + i16, int32([-48,-80;-112,-144]));
+assert_checkequal(I32 + I16, int32([-48,-96;-144,-192]));
+assert_checkequal(I32 + ui16, uint32([4294967280,4294967248;4294967216,4294967184]));
+assert_checkequal(I32 + UI16, uint32([4294967280,4294967264;4294967248,4294967232]));
+assert_checkequal(I32 + i32, int32([-64,-96;-128,-160]));
+assert_checkequal(I32 + I32, int32([-64,-128;-192,-256]));
+assert_checkequal(I32 + ui32, uint32([0,4294967264;4294967232,4294967200]));
+assert_checkequal(I32 + UI32, uint32([0,0;0,0]));
+assert_checkequal(ui32 + empty, uint32(32));
+assert_checkequal(ui32 + r, uint32(34));
+assert_checkequal(ui32 + R, uint32([33,34;35,36]));
+assert_checkequal(ui32 + i8, uint32(24));
+assert_checkequal(ui32 + I8, uint32([24,16;8,0]));
+assert_checkequal(ui32 + ui8, uint32(40));
+assert_checkequal(ui32 + UI8, uint32([40,48;56,64]));
+assert_checkequal(ui32 + i16, uint32(16));
+assert_checkequal(ui32 + I16, uint32([16,0;4294967280,4294967264]));
+assert_checkequal(ui32 + ui16, uint32(48));
+assert_checkequal(ui32 + UI16, uint32([48,64;80,96]));
+assert_checkequal(ui32 + i32, uint32(0));
+assert_checkequal(ui32 + I32, uint32([0,4294967264;4294967232,4294967200]));
+assert_checkequal(ui32 + ui32, uint32(64));
+assert_checkequal(ui32 + UI32, uint32([64,96;128,160]));
+assert_checkequal(UI32 + empty, uint32([32,64;96,128]));
+assert_checkequal(UI32 + r, uint32([34,66;98,130]));
+assert_checkequal(UI32 + R, uint32([33,66;99,132]));
+assert_checkequal(UI32 + i8, uint32([24,56;88,120]));
+assert_checkequal(UI32 + I8, uint32([24,48;72,96]));
+assert_checkequal(UI32 + ui8, uint32([40,72;104,136]));
+assert_checkequal(UI32 + UI8, uint32([40,80;120,160]));
+assert_checkequal(UI32 + i16, uint32([16,48;80,112]));
+assert_checkequal(UI32 + I16, uint32([16,32;48,64]));
+assert_checkequal(UI32 + ui16, uint32([48,80;112,144]));
+assert_checkequal(UI32 + UI16, uint32([48,96;144,192]));
+assert_checkequal(UI32 + i32, uint32([0,32;64,96]));
+assert_checkequal(UI32 + I32, uint32([0,0;0,0]));
+assert_checkequal(UI32 + ui32, uint32([64,96;128,160]));
+assert_checkequal(UI32 + UI32, uint32([64,128;192,256]));
+assert_checkequal(str + empty, "string");
+assert_checkequal(str + str, "stringstring");
+assert_checkequal(str + STR, ["stringstring1","stringstring2";"stringstring3","stringstring4"]);
+assert_checkequal(STR + empty, ["string1","string2";"string3","string4"]);
+assert_checkequal(STR + str, ["string1string","string2string";"string3string","string4string"]);
+assert_checkequal(STR + STR, ["string1string1","string2string2";"string3string3","string4string4"]);
index edb61e0..35ab54e 100644 (file)
@@ -7,6 +7,8 @@
 
 // <-- JVM NOT MANDATORY -->
 
+s = %s;
+empty = [];
 r = 2;
 R = [1,2;3,4];
 R3(:,:,1) = R;
@@ -16,295 +18,422 @@ C = [1+2*%i,2+4*%i;3+6*%i,4+8*%i];
 C3(:,:,1) = C;
 C3(:,:,2) = C';
 e = eye();
-ei = (5+%i) * eye();
+ec = (5+%i) * eye();
 p = 1 + %s - %s**2;
 pc = 1 + %s - %s**2 + ( 2 - 3 * %s + 4 * %s**2 ) * %i;
 P = [2*p, -3*p;4*p,-5*p];
 PC = [2*pc, -3*pc;4*pc,-5*pc];
 SP = sparse([1,2;4,5;3,10],[1,2,3]);
-SPC = sparse([1,2;4,5;3,10],[1,2,3]) + sparse([1,2;4,5;3,10],[1,2,3]) * -4*%i;
-
-assert_checkequal((1:3) + 1, 2:4);
-assert_checkequal((1:3) + (4:6), [5 7 9]);
-assert_checkequal(1 + (1:3), 2:4);
-
-//[] + []
-assert_checkequal([] + [], []);
-
-//double + []
-//r + []
-assert_checkequal(r + [], r);
-//c + []
-assert_checkequal(c + [], c);
-
-//[] + double
-//[] + r
-assert_checkequal([] + r, r);
-//[] + c
-assert_checkequal([] + c, c);
-
-//DOUBLE + []
-//R + []
-assert_checkequal(R + [], R);
-//C + []
-assert_checkequal(C + [], C);
-
-//[] + DOUBLE
-//[] + R
-assert_checkequal([] + R, R);
-//[] + C
-assert_checkequal([] + C, C);
-
-
-// double + double
-
-//r + r
+SPC = sparse([1,2;4,5;3,10],[1,2,3]) * ( 1 + 4*%i);
+
+i8 = int8(-8);
+ui8 = uint8(8);
+I8 = int8([-8 -16 ; -24 -32]);
+UI8 = uint8([8 16 ; 24 32]);
+
+I16 = int16([-16 -32 ; -48 -64]);
+UI16 = uint16([16 32 ; 48 64]);
+i16 = int16(-16);
+ui16 = uint16(16);
+
+i32 = int32(-32);
+ui32 = uint32(32);
+I32 = int32([-32 -64 ; -96 -128]);
+UI32 = uint32([32 64 ; 96 128]);
+
+str = "string";
+STR = ["string1" "string2";"string3" "string4"];
+
+assert_checkequal(empty + empty, []);
+assert_checkequal(empty + r, 2);
+assert_checkequal(empty + c,  1+%i*2);
+assert_checkequal(empty + R, [1,2;3,4]);
+assert_checkequal(empty + C, [ 1+%i*2, 2+%i*4; 3+%i*6, 4+%i*8]);
+assert_checkequal(empty + e, eye());
+assert_checkequal(empty + ec, ( 5+%i)*eye());
+assert_checkequal(empty + p, 1+s-s^2);
+assert_checkequal(empty + pc, 1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(empty + P, [2+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-5-5*s+5*s^2]);
+assert_checkequal(empty + PC, [2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-5-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(empty + SP, sparse([1,2;3,10;4,5],[1;3;2],[4,10]));
+assert_checkequal(empty + SPC, sparse([1,2;3,10;4,5],[ 1+%i*4; 3+%i*12; 2+%i*8],[4,10]));
+assert_checkequal(empty + i8, int8(-8));
+assert_checkequal(empty + I8, int8([-8,-16;-24,-32]));
+assert_checkequal(empty + ui8, uint8(8));
+assert_checkequal(empty + UI8, uint8([8,16;24,32]));
+assert_checkequal(empty + i16, int16(-16));
+assert_checkequal(empty + I16, int16([-16,-32;-48,-64]));
+assert_checkequal(empty + ui16, uint16(16));
+assert_checkequal(empty + UI16, uint16([16,32;48,64]));
+assert_checkequal(empty + i32, int32(-32));
+assert_checkequal(empty + I32, int32([-32,-64;-96,-128]));
+assert_checkequal(empty + ui32, uint32(32));
+assert_checkequal(empty + UI32, uint32([32,64;96,128]));
+
+assert_checkequal(r + empty, 2);
 assert_checkequal(r + r, 4);
-//r + c
-assert_checkequal(r + c, 3+2*%i);
-//c + r
-assert_checkequal(c + r, 3+2*%i);
-//c + c
-assert_checkequal(c + c, 2+4*%i);
-
-
-//double + DOUBLE
-
-//r + R
+assert_checkequal(r + c,  3+%i*2);
 assert_checkequal(r + R, [3,4;5,6]);
-rR3ref(:,:,1) = [3,4;5,6];
-rR3ref(:,:,2) = [3,5;4,6];
-assert_checkequal(r + R3, rR3ref);
-//r + C
-assert_checkequal(r + C, [3+2*%i,4+4*%i;5+6*%i,6+8*%i]);
-rC3ref(:,:,1) = [3+2*%i,4+4*%i;5+6*%i,6+8*%i];
-rC3ref(:,:,2) = [3-2*%i,5-6*%i;4-4*%i,6-8*%i];
-assert_checkequal(r + C3, rC3ref);
-//c + R
-assert_checkequal(c + R, [2+2*%i,3+2*%i;4+2*%i,5+2*%i]);
-cR3ref(:,:,1) = [2+2*%i,3+2*%i;4+2*%i,5+2*%i];
-cR3ref(:,:,2) = [2+2*%i,4+2*%i;3+2*%i,5+2*%i];
-assert_checkequal(c + R3, cR3ref);
-//c + C
-assert_checkequal(c + C, [2+4*%i,3+6*%i;4+8*%i,5+10*%i]);
-cC3ref(:,:,1) = [2+4*%i,3+6*%i;4+8*%i,5+10*%i];
-cC3ref(:,:,2) = [2,4-4*%i;3-2*%i,5-6*%i];
-assert_checkequal(c + C3, cC3ref);
-
-
-//DOUBLE + double
-
-//R + r
+assert_checkequal(r + C, [ 3+%i*2, 4+%i*4; 5+%i*6, 6+%i*8]);
+assert_checkequal(r + e, 3);
+assert_checkequal(r + ec,  7+%i);
+assert_checkequal(r + p, 3+s-s^2);
+assert_checkequal(r + pc, 3+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(r + P, [4+2*s-2*s^2,-1-3*s+3*s^2;6+4*s-4*s^2,-3-5*s+5*s^2]);
+assert_checkequal(r + PC, [4+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-1-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;6+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-3-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(r + SP, [2,3,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,5;2,2,2,2,4,2,2,2,2,2]);
+assert_checkequal(r + SPC, [ 2, 3+%i*4, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2, 5+%i*12; 2, 2, 2, 2, 4+%i*8, 2, 2, 2, 2, 2]);
+assert_checkequal(r + i8, int8(-6));
+assert_checkequal(r + I8, int8([-6,-14;-22,-30]));
+assert_checkequal(r + ui8, uint8(10));
+assert_checkequal(r + UI8, uint8([10,18;26,34]));
+assert_checkequal(r + i16, int16(-14));
+assert_checkequal(r + I16, int16([-14,-30;-46,-62]));
+assert_checkequal(r + ui16, uint16(18));
+assert_checkequal(r + UI16, uint16([18,34;50,66]));
+assert_checkequal(r + i32, int32(-30));
+assert_checkequal(r + I32, int32([-30,-62;-94,-126]));
+assert_checkequal(r + ui32, uint32(34));
+assert_checkequal(r + UI32, uint32([34,66;98,130]));
+
+assert_checkequal(c + empty,  1+%i*2);
+assert_checkequal(c + r,  3+%i*2);
+assert_checkequal(c + c,  2+%i*4);
+assert_checkequal(c + R, [ 2+%i*2, 3+%i*2; 4+%i*2, 5+%i*2]);
+assert_checkequal(c + C, [ 2+%i*4, 3+%i*6; 4+%i*8, 5+%i*10]);
+assert_checkequal(c + e,  2+%i*2);
+assert_checkequal(c + ec,  6+%i*3);
+assert_checkequal(c + p, 2+%i*2+s-s^2);
+assert_checkequal(c + pc, 2+%i*4+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(c + P, [3+%i*2+2*s-2*s^2,-2+%i*2-3*s+3*s^2;5+%i*2+4*s-4*s^2,-4+%i*2-5*s+5*s^2]);
+assert_checkequal(c + PC, [3+%i*6+(2-%i*6)*s+(-2+%i*8)*s^2,-2-%i*4+(-3+%i*9)*s+(3-%i*12)*s^2;5+%i*10+(4-%i*12)*s+(-4+%i*16)*s^2,-4-%i*8+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(c + SP, [ 1+%i*2, 2+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 4+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 3+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
+assert_checkequal(c + SPC, [ 1+%i*2, 2+%i*6, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 4+%i*14; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 3+%i*10, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
+
+assert_checkequal(R + empty, [1,2;3,4]);
 assert_checkequal(R + r, [3,4;5,6]);
-R3rref(:,:,1) = [3,4;5,6];
-R3rref(:,:,2) = [3,5;4,6];
-assert_checkequal(R3 + r, R3rref);
-//R + c
-assert_checkequal(R + c, [2+2*%i,3+2*%i;4+2*%i,5+2*%i]);
-R3cref(:,:,1) = [2+2*%i,3+2*%i;4+2*%i,5+2*%i];
-R3cref(:,:,2) = [2+2*%i,4+2*%i;3+2*%i,5+2*%i];
-assert_checkequal(R3 + c, R3cref);
-//C + r
-assert_checkequal(C + r, [3+2*%i,4+4*%i;5+6*%i,6+8*%i]);
-C3rref(:,:,1) = [3+2*%i,4+4*%i;5+6*%i,6+8*%i];
-C3rref(:,:,2) = [3-2*%i,5-6*%i;4-4*%i,6-8*%i];
-assert_checkequal(C3 + r, C3rref);
-//c + c
-assert_checkequal(C + c, [2+4*%i,3+6*%i;4+8*%i,5+10*%i]);
-C3cref(:,:,1) = [2+4*%i,3+6*%i;4+8*%i,5+10*%i];
-C3cref(:,:,2) = [2,4-4*%i;3-2*%i,5-6*%i];
-assert_checkequal(C3 + c, C3cref);
-
-
-//DOUBLE + DOUBLE
-//R + R
+assert_checkequal(R + c, [ 2+%i*2, 3+%i*2; 4+%i*2, 5+%i*2]);
 assert_checkequal(R + R, [2,4;6,8]);
-R3R3ref(:,:,1) = [2,4;6,8];
-R3R3ref(:,:,2) = [2,6;4,8];
-assert_checkequal(R3 + R3, R3R3ref);
-//R + C
-assert_checkequal(R + C, [2+2*%i,4+4*%i;6+6*%i,8+8*%i]);
-R3C3ref(:,:,1) = [2+2*%i,4+4*%i;6+6*%i,8+8*%i];
-R3C3ref(:,:,2) = [2-2*%i,6-6*%i;4-4*%i,8-8*%i];
-assert_checkequal(R3 + C3, R3C3ref);
-//C + R
-assert_checkequal(C + R, [2+2*%i,4+4*%i;6+6*%i,8+8*%i]);
-C3R3ref(:,:,1) = [2+2*%i,4+4*%i;6+6*%i,8+8*%i];
-C3R3ref(:,:,2) = [2-2*%i,6-6*%i;4-4*%i,8-8*%i];
-assert_checkequal(C3 + R3, C3R3ref);
-//C + C
-assert_checkequal(C + C, [2+4*%i,4+8*%i;6+12*%i,8+16*%i]);
-C3C3ref(:,:,1) = [2+4*%i,4+8*%i;6+12*%i,8+16*%i];
-C3C3ref(:,:,2) = [2-4*%i,6-12*%i;4-8*%i,8-16*%i];
-assert_checkequal(C3 + C3, C3C3ref);
-
-//identity
-//e + R
-assert_checkequal(e + R, [2 2 ;3 5]);
-//R + e
-assert_checkequal(R + e, [2 2 ;3 5]);
-
-//e + C
-assert_checkequal(e + C, [2+2*%i,2+4*%i;3+6*%i,5+8*%i]);
-//C + e
-assert_checkequal(C + e, [2+2*%i,2+4*%i;3+6*%i,5+8*%i]);
-
-//e + r
+assert_checkequal(R + C, [ 2+%i*2, 4+%i*4; 6+%i*6, 8+%i*8]);
+assert_checkequal(R + e, [2,2;3,5]);
+assert_checkequal(R + ec, [ 6+%i, 2; 3, 9+%i]);
+assert_checkequal(R + p, [2+s-s^2,3+s-s^2;4+s-s^2,5+s-s^2]);
+assert_checkequal(R + pc, [2+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,3+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2;4+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,5+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2]);
+assert_checkequal(R + P, [3+2*s-2*s^2,-1-3*s+3*s^2;7+4*s-4*s^2,-1-5*s+5*s^2]);
+assert_checkequal(R + PC, [3+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-1-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;7+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-1-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(R + i8, int8([-7,-6;-5,-4]));
+assert_checkequal(R + I8, int8([-7,-14;-21,-28]));
+assert_checkequal(R + ui8, uint8([9,10;11,12]));
+assert_checkequal(R + UI8, uint8([9,18;27,36]));
+assert_checkequal(R + i16, int16([-15,-14;-13,-12]));
+assert_checkequal(R + I16, int16([-15,-30;-45,-60]));
+assert_checkequal(R + ui16, uint16([17,18;19,20]));
+assert_checkequal(R + UI16, uint16([17,34;51,68]));
+assert_checkequal(R + i32, int32([-31,-30;-29,-28]));
+assert_checkequal(R + I32, int32([-31,-62;-93,-124]));
+assert_checkequal(R + ui32, uint32([33,34;35,36]));
+assert_checkequal(R + UI32, uint32([33,66;99,132]));
+
+assert_checkequal(C + empty, [ 1+%i*2, 2+%i*4; 3+%i*6, 4+%i*8]);
+assert_checkequal(C + r, [ 3+%i*2, 4+%i*4; 5+%i*6, 6+%i*8]);
+assert_checkequal(C + c, [ 2+%i*4, 3+%i*6; 4+%i*8, 5+%i*10]);
+assert_checkequal(C + R, [ 2+%i*2, 4+%i*4; 6+%i*6, 8+%i*8]);
+assert_checkequal(C + C, [ 2+%i*4, 4+%i*8; 6+%i*12, 8+%i*16]);
+assert_checkequal(C + e, [ 2+%i*2, 2+%i*4; 3+%i*6, 5+%i*8]);
+assert_checkequal(C + ec, [ 6+%i*3, 2+%i*4; 3+%i*6, 9+%i*9]);
+assert_checkequal(C + p, [2+%i*2+s-s^2,3+%i*4+s-s^2;4+%i*6+s-s^2,5+%i*8+s-s^2]);
+assert_checkequal(C + pc, [2+%i*4+(1-%i*3)*s+(-1+%i*4)*s^2,3+%i*6+(1-%i*3)*s+(-1+%i*4)*s^2;4+%i*8+(1-%i*3)*s+(-1+%i*4)*s^2,5+%i*10+(1-%i*3)*s+(-1+%i*4)*s^2]);
+assert_checkequal(C + P, [3+%i*2+2*s-2*s^2,-1+%i*4-3*s+3*s^2;7+%i*6+4*s-4*s^2,-1+%i*8-5*s+5*s^2]);
+assert_checkequal(C + PC, [3+%i*6+(2-%i*6)*s+(-2+%i*8)*s^2,-1-%i*2+(-3+%i*9)*s+(3-%i*12)*s^2;7+%i*14+(4-%i*12)*s+(-4+%i*16)*s^2,-1-%i*2+(-5+%i*15)*s+(5-%i*20)*s^2]);
+
+assert_checkequal(e + empty, eye());
 assert_checkequal(e + r, 3);
-//r + e
-assert_checkequal(r + e, 3);
-
-//e + c
-assert_checkequal(e + c, 2+2*%i);
-//c + e
-assert_checkequal(c + e, 2+2*%i);
-
-//e + []
-assert_checkequal(e + [], e);
-//[] + e
-assert_checkequal([] + e, e);
-
-//e + e
-assert_checkequal(e + e, 2* eye());
-//e + ei
-assert_checkequal(e + ei, (6+%i) * eye());
-
-
-//identity complex
-//ei + R
-assert_checkequal(ei + R, [6+%i,2;3,9+%i]);
-//R + ei
-assert_checkequal(R + ei, [6+%i,2;3,9+%i]);
-
-//ei + C
-assert_checkequal(ei + C, [6+3*%i,2+4*%i;3+6*%i,9+9*%i]);
-//C + ei
-assert_checkequal(C + ei, [6+3*%i,2+4*%i;3+6*%i,9+9*%i]);
-
-//ei + r
-assert_checkequal(ei + r, 7 + %i);
-//r + ei
-assert_checkequal(r + ei, 7 + %i);
-
-//ei + c
-assert_checkequal(ei + c, 6+3*%i);
-//c + ei
-assert_checkequal(c + ei, 6+3*%i);
-
-//ei + []
-assert_checkequal(ei + [], ei);
-//[] + ei
-assert_checkequal([] + ei, ei);
-
-//ei + e
-assert_checkequal(ei + e, (6+%i) * eye());
-//ei + ei
-assert_checkequal(ei + ei, (10+2*%i) * eye());
-
-//poly
-//p + []
-assert_checkequal(p + [], p);
-//[] + p
-assert_checkequal([] + p, p);
-//pc + []
-assert_checkequal(pc + [], pc);
-//[] + pc
-assert_checkequal([] + pc, pc);
-//P + []
-assert_checkequal(P + [], P);
-//[] + P
-assert_checkequal([] + P, P);
-//PC + []
-assert_checkequal(PC + [], PC);
-//[] + PC
-assert_checkequal([] + PC, PC);
-
-//p + r
-assert_checkequal(p + r, 3+%s-%s**2);
-//r + p
-assert_checkequal(r + p, 3+%s-%s**2);
-//p + c
-assert_checkequal(p + c, 2+%s-%s**2 + 2*%i);
-//c + p
-assert_checkequal(c + p, 2+%s-%s**2 + 2*%i);
-
-//p + R
-assert_checkequal(p + R, [2+%s-%s**2,3+%s-%s**2;4+%s-%s**2,5+%s-%s**2]);
-//R + p
-assert_checkequal(R + p, [2+%s-%s**2,3+%s-%s**2;4+%s-%s**2,5+%s-%s**2]);
-//p + C
-assert_checkequal(p + C, [2+%s-%s**2+2*%i,3+%s-%s**2+4*%i;4+%s-%s**2+6*%i,5+%s-%s**2+8*%i]);
-//C + p
-assert_checkequal(C + p, [2+%s-%s**2+2*%i,3+%s-%s**2+4*%i;4+%s-%s**2+6*%i,5+%s-%s**2+8*%i]);
-
-//p + p
-assert_checkequal(p + p, 2 + 2*%s - 2*%s**2);
-//p + pc
-assert_checkequal(p + pc, 2 + 2*%s - 2*%s**2 + (2-3*%s+4*%s**2) * %i);
-//pc + p
-assert_checkequal(pc + p, 2 + 2*%s - 2*%s**2 + (2-3*%s+4*%s**2) * %i);
-//pc + pc
-assert_checkequal(pc + pc, 2 + 2*%s - 2*%s**2 + (4-6*%s+8*%s**2) * %i);
-
-//P + p
-assert_checkequal(P + p, [3+3*%s-3*%s**2,-2-2*%s+2*%s**2;5+5*%s-5*%s**2,-4-4*%s+4*%s**2]);
-//p + P
-assert_checkequal(p + P, [3+3*%s-3*%s**2,-2-2*%s+2*%s**2;5+5*%s-5*%s**2,-4-4*%s+4*%s**2]);
-//P + pc
-assert_checkequal(P + pc, [3+3*%s-3*%s**2+(2-3*%s+4*%s**2)*%i,-2-2*%s+2*%s**2+(2-3*%s+4*%s**2)*%i;5+5*%s-5*%s**2+(2-3*%s+4*%s**2)*%i,-4-4*%s+4*%s**2+(2-3*%s+4*%s**2)*%i]);
-//pc + P
-assert_checkequal(pc + P, [3+3*%s-3*%s**2+(2-3*%s+4*%s**2)*%i,-2-2*%s+2*%s**2+(2-3*%s+4*%s**2)*%i;5+5*%s-5*%s**2+(2-3*%s+4*%s**2)*%i,-4-4*%s+4*%s**2+(2-3*%s+4*%s**2)*%i]);
-//PC + p
-assert_checkequal(PC + p, [3+3*%s-3*%s**2+(4-6*%s+8*%s**2)*%i,-2-2*%s+2*%s**2+(-6+9*%s-12*%s**2)*%i;5+5*%s-5*%s**2+(8-12*%s+16*%s**2)*%i,-4-4*%s+4*%s**2+(-10+15*%s-20*%s**2)*%i]);
-//p + PC
-assert_checkequal(p + PC, [3+3*%s-3*%s**2+(4-6*%s+8*%s**2)*%i,-2-2*%s+2*%s**2+(-6+9*%s-12*%s**2)*%i;5+5*%s-5*%s**2+(8-12*%s+16*%s**2)*%i,-4-4*%s+4*%s**2+(-10+15*%s-20*%s**2)*%i]);
-//PC + pc
-assert_checkequal(PC + pc, [3+3*%s-3*%s**2+(6-9*%s+12*%s**2)*%i,-2-2*%s+2*%s**2+(-4+6*%s-8*%s**2)*%i;5+5*%s-5*%s**2+(10-15*%s+20*%s**2)*%i,-4-4*%s+4*%s**2+(-8+12*%s-16*%s**2)*%i]);
-//pc + PC
-assert_checkequal(pc + PC, [3+3*%s-3*%s**2+(6-9*%s+12*%s**2)*%i,-2-2*%s+2*%s**2+(-4+6*%s-8*%s**2)*%i;5+5*%s-5*%s**2+(10-15*%s+20*%s**2)*%i,-4-4*%s+4*%s**2+(-8+12*%s-16*%s**2)*%i]);
-
-//P + P
-assert_checkequal(P + P, [4+4*%s-4*%s**2,-6-6*%s+6*%s**2;8+8*%s-8*%s**2,-10-10*%s+10*%s**2]);
-//P + PC
-assert_checkequal(P + PC, [4+4*%s-4*%s**2+(4-6*%s+8*%s**2)*%i,-6-6*%s+6*%s**2+(-6+9*%s-12*%s**2)*%i;8+8*%s-8*%s**2+(8-12*%s+16*%s**2)*%i,-10-10*%s+10*%s**2+(-10+15*%s-20*%s**2)*%i]);
-//PC + P
-assert_checkequal(PC + P, [4+4*%s-4*%s**2+(4-6*%s+8*%s**2)*%i,-6-6*%s+6*%s**2+(-6+9*%s-12*%s**2)*%i;8+8*%s-8*%s**2+(8-12*%s+16*%s**2)*%i,-10-10*%s+10*%s**2+(-10+15*%s-20*%s**2)*%i]);
-//PC + PC
-assert_checkequal(PC + PC, [4+4*%s-4*%s**2+(8-12*%s+16*%s**2)*%i,-6-6*%s+6*%s**2+(-12+18*%s-24*%s**2)*%i;8+8*%s-8*%s**2+(16-24*%s+32*%s**2)*%i,-10-10*%s+10*%s**2+(-20+30*%s-40*%s**2)*%i]);
-
-
-//sparse
-//SP + []
-assert_checkequal(SP + [], SP);
-//[] + SP
-assert_checkequal([] + SP, SP);
-//SPC + []
-assert_checkequal(SPC + [], SPC);
-//[] + SPC
-assert_checkequal([] + SPC, SPC);
-
-//SP + r
-assert_checkequal(SP + r, full(SP) + r);
-//r + SP
-assert_checkequal(r + SP, full(SP) + r);
-//SP + c
-assert_checkequal(SP + c, full(SP) + c);
-//c + SP
-assert_checkequal(c + SP, full(SP) + c);
-//SPC + r
-assert_checkequal(SPC + r, full(SPC) + r);
-//r + SPC
-assert_checkequal(r + SPC, full(SPC) + r);
-//SPC + c
-assert_checkequal(SPC + c, full(SPC) + c);
-//c + SPC
-assert_checkequal(c + SPC, full(SPC) + c);
-
-//SP + SP
-assert_checkequal(SP + SP, sparse(full(SP) + full(SP)));
-//SP + SPC
-assert_checkequal(SP + SPC, sparse(full(SP) + full(SPC)));
-//SPC + SP
-assert_checkequal(SPC + SP, sparse(full(SPC) + full(SP)));
-//SPC + SPC
-assert_checkequal(SPC + SPC, sparse(full(SPC) + full(SPC)));
+assert_checkequal(e + c,  2+%i*2);
+assert_checkequal(e + R, [2,2;3,5]);
+assert_checkequal(e + C, [ 2+%i*2, 2+%i*4; 3+%i*6, 5+%i*8]);
+assert_checkequal(e + e, (2)*eye());
+assert_checkequal(e + ec, ( 6+%i)*eye());
+assert_checkequal(e + p, 2+s-s^2);
+assert_checkequal(e + pc, 2+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(e + P, [3+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-4-5*s+5*s^2]);
+assert_checkequal(e + PC, [3+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-4-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(e + SP, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[1;1;1;1;3;1;2],[4,10]));
+assert_checkequal(e + SPC, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 1; 1+%i*4; 1; 1; 3+%i*12; 1; 2+%i*8],[4,10]));
+
+assert_checkequal(ec + empty, ( 5+%i)*eye());
+assert_checkequal(ec + r,  7+%i);
+assert_checkequal(ec + c,  6+%i*3);
+assert_checkequal(ec + R, [ 6+%i, 2; 3, 9+%i]);
+assert_checkequal(ec + C, [ 6+%i*3, 2+%i*4; 3+%i*6, 9+%i*9]);
+assert_checkequal(ec + e, ( 6+%i)*eye());
+assert_checkequal(ec + ec, ( 10+%i*2)*eye());
+assert_checkequal(ec + p, 6+%i+s-s^2);
+assert_checkequal(ec + pc, 6+%i*3+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(ec + P, [7+%i+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,%i-5*s+5*s^2]);
+assert_checkequal(ec + PC, [7+%i*5+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-%i*9+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(ec + SP, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i; 1; 5+%i; 5+%i; 3; 5+%i; 2],[4,10]));
+assert_checkequal(ec + SPC, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i; 1+%i*4; 5+%i; 5+%i; 3+%i*12; 5+%i; 2+%i*8],[4,10]));
+
+assert_checkequal(p + empty, 1+s-s^2);
+assert_checkequal(p + r, 3+s-s^2);
+assert_checkequal(p + c, 2+%i*2+s-s^2);
+assert_checkequal(p + R, [2+s-s^2,3+s-s^2;4+s-s^2,5+s-s^2]);
+assert_checkequal(p + C, [2+%i*2+s-s^2,3+%i*4+s-s^2;4+%i*6+s-s^2,5+%i*8+s-s^2]);
+assert_checkequal(p + e, 2+s-s^2);
+assert_checkequal(p + ec, 6+%i+s-s^2);
+assert_checkequal(p + p, 2+2*s-2*s^2);
+assert_checkequal(p + pc, 2+%i*2+(2-%i*3)*s+(-2+%i*4)*s^2);
+assert_checkequal(p + P, [3+3*s-3*s^2,-2-2*s+2*s^2;5+5*s-5*s^2,-4-4*s+4*s^2]);
+assert_checkequal(p + PC, [3+%i*4+(3-%i*6)*s+(-3+%i*8)*s^2,-2-%i*6+(-2+%i*9)*s+(2-%i*12)*s^2;5+%i*8+(5-%i*12)*s+(-5+%i*16)*s^2,-4-%i*10+(-4+%i*15)*s+(4-%i*20)*s^2]);
+
+assert_checkequal(pc + empty, 1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc + r, 3+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc + c, 2+%i*4+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc + R, [2+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,3+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2;4+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,5+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2]);
+assert_checkequal(pc + C, [2+%i*4+(1-%i*3)*s+(-1+%i*4)*s^2,3+%i*6+(1-%i*3)*s+(-1+%i*4)*s^2;4+%i*8+(1-%i*3)*s+(-1+%i*4)*s^2,5+%i*10+(1-%i*3)*s+(-1+%i*4)*s^2]);
+assert_checkequal(pc + e, 2+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc + ec, 6+%i*3+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc + p, 2+%i*2+(2-%i*3)*s+(-2+%i*4)*s^2);
+assert_checkequal(pc + pc, 2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2);
+assert_checkequal(pc + P, [3+%i*2+(3-%i*3)*s+(-3+%i*4)*s^2,-2+%i*2+(-2-%i*3)*s+(2+%i*4)*s^2;5+%i*2+(5-%i*3)*s+(-5+%i*4)*s^2,-4+%i*2+(-4-%i*3)*s+(4+%i*4)*s^2]);
+assert_checkequal(pc + PC, [3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2,-2-%i*4+(-2+%i*6)*s+(2-%i*8)*s^2;5+%i*10+(5-%i*15)*s+(-5+%i*20)*s^2,-4-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2]);
+
+assert_checkequal(P + empty, [2+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-5-5*s+5*s^2]);
+assert_checkequal(P + r, [4+2*s-2*s^2,-1-3*s+3*s^2;6+4*s-4*s^2,-3-5*s+5*s^2]);
+assert_checkequal(P + c, [3+%i*2+2*s-2*s^2,-2+%i*2-3*s+3*s^2;5+%i*2+4*s-4*s^2,-4+%i*2-5*s+5*s^2]);
+assert_checkequal(P + R, [3+2*s-2*s^2,-1-3*s+3*s^2;7+4*s-4*s^2,-1-5*s+5*s^2]);
+assert_checkequal(P + C, [3+%i*2+2*s-2*s^2,-1+%i*4-3*s+3*s^2;7+%i*6+4*s-4*s^2,-1+%i*8-5*s+5*s^2]);
+assert_checkequal(P + e, [3+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-4-5*s+5*s^2]);
+assert_checkequal(P + ec, [7+%i+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,%i-5*s+5*s^2]);
+assert_checkequal(P + p, [3+3*s-3*s^2,-2-2*s+2*s^2;5+5*s-5*s^2,-4-4*s+4*s^2]);
+assert_checkequal(P + pc, [3+%i*2+(3-%i*3)*s+(-3+%i*4)*s^2,-2+%i*2+(-2-%i*3)*s+(2+%i*4)*s^2;5+%i*2+(5-%i*3)*s+(-5+%i*4)*s^2,-4+%i*2+(-4-%i*3)*s+(4+%i*4)*s^2]);
+assert_checkequal(P + P, [4+4*s-4*s^2,-6-6*s+6*s^2;8+8*s-8*s^2,-10-10*s+10*s^2]);
+assert_checkequal(P + PC, [4+%i*4+(4-%i*6)*s+(-4+%i*8)*s^2,-6-%i*6+(-6+%i*9)*s+(6-%i*12)*s^2;8+%i*8+(8-%i*12)*s+(-8+%i*16)*s^2,-10-%i*10+(-10+%i*15)*s+(10-%i*20)*s^2]);
+
+assert_checkequal(PC + empty, [2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-5-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + r, [4+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-1-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;6+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-3-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + c, [3+%i*6+(2-%i*6)*s+(-2+%i*8)*s^2,-2-%i*4+(-3+%i*9)*s+(3-%i*12)*s^2;5+%i*10+(4-%i*12)*s+(-4+%i*16)*s^2,-4-%i*8+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + R, [3+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-1-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;7+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-1-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + C, [3+%i*6+(2-%i*6)*s+(-2+%i*8)*s^2,-1-%i*2+(-3+%i*9)*s+(3-%i*12)*s^2;7+%i*14+(4-%i*12)*s+(-4+%i*16)*s^2,-1-%i*2+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + e, [3+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-4-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + ec, [7+%i*5+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-%i*9+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC + p, [3+%i*4+(3-%i*6)*s+(-3+%i*8)*s^2,-2-%i*6+(-2+%i*9)*s+(2-%i*12)*s^2;5+%i*8+(5-%i*12)*s+(-5+%i*16)*s^2,-4-%i*10+(-4+%i*15)*s+(4-%i*20)*s^2]);
+assert_checkequal(PC + pc, [3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2,-2-%i*4+(-2+%i*6)*s+(2-%i*8)*s^2;5+%i*10+(5-%i*15)*s+(-5+%i*20)*s^2,-4-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2]);
+assert_checkequal(PC + P, [4+%i*4+(4-%i*6)*s+(-4+%i*8)*s^2,-6-%i*6+(-6+%i*9)*s+(6-%i*12)*s^2;8+%i*8+(8-%i*12)*s+(-8+%i*16)*s^2,-10-%i*10+(-10+%i*15)*s+(10-%i*20)*s^2]);
+assert_checkequal(PC + PC, [4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-6-%i*12+(-6+%i*18)*s+(6-%i*24)*s^2;8+%i*16+(8-%i*24)*s+(-8+%i*32)*s^2,-10-%i*20+(-10+%i*30)*s+(10-%i*40)*s^2]);
+
+assert_checkequal(SP + empty, sparse([1,2;3,10;4,5],[1;3;2],[4,10]));
+assert_checkequal(SP + r, [2,3,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,5;2,2,2,2,4,2,2,2,2,2]);
+assert_checkequal(SP + c, [ 1+%i*2, 2+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 4+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 3+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
+assert_checkequal(SP + e, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[1;1;1;1;3;1;2],[4,10]));
+assert_checkequal(SP + ec, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i; 1; 5+%i; 5+%i; 3; 5+%i; 2],[4,10]));
+assert_checkequal(SP + SP, sparse([1,2;3,10;4,5],[2;6;4],[4,10]));
+assert_checkequal(SP + SPC, sparse([1,2;3,10;4,5],[ 2+%i*4; 6+%i*12; 4+%i*8],[4,10]));
+
+assert_checkequal(SPC + empty, sparse([1,2;3,10;4,5],[ 1+%i*4; 3+%i*12; 2+%i*8],[4,10]));
+assert_checkequal(SPC + r, [ 2, 3+%i*4, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2, 5+%i*12; 2, 2, 2, 2, 4+%i*8, 2, 2, 2, 2, 2]);
+assert_checkequal(SPC + c, [ 1+%i*2, 2+%i*6, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 4+%i*14; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 3+%i*10, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
+assert_checkequal(SPC + e, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 1; 1+%i*4; 1; 1; 3+%i*12; 1; 2+%i*8],[4,10]));
+assert_checkequal(SPC + ec, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i; 1+%i*4; 5+%i; 5+%i; 3+%i*12; 5+%i; 2+%i*8],[4,10]));
+assert_checkequal(SPC + SP, sparse([1,2;3,10;4,5],[ 2+%i*4; 6+%i*12; 4+%i*8],[4,10]));
+assert_checkequal(SPC + SPC, sparse([1,2;3,10;4,5],[ 2+%i*8; 6+%i*24; 4+%i*16],[4,10]));
+
+assert_checkequal(i8 + empty, int8(-8));
+assert_checkequal(i8 + r, int8(-6));
+assert_checkequal(i8 + R, int8([-7,-6;-5,-4]));
+assert_checkequal(i8 + i8, int8(-16));
+assert_checkequal(i8 + I8, int8([-16,-24;-32,-40]));
+assert_checkequal(i8 + ui8, uint8(0));
+assert_checkequal(i8 + UI8, uint8([0,8;16,24]));
+assert_checkequal(i8 + i16, int16(-24));
+assert_checkequal(i8 + I16, int16([-24,-40;-56,-72]));
+assert_checkequal(i8 + ui16, uint16(8));
+assert_checkequal(i8 + UI16, uint16([8,24;40,56]));
+assert_checkequal(i8 + i32, int32(-40));
+assert_checkequal(i8 + I32, int32([-40,-72;-104,-136]));
+assert_checkequal(i8 + ui32, uint32(24));
+assert_checkequal(i8 + UI32, uint32([24,56;88,120]));
+
+assert_checkequal(I8 + empty, int8([-8,-16;-24,-32]));
+assert_checkequal(I8 + r, int8([-6,-14;-22,-30]));
+assert_checkequal(I8 + R, int8([-7,-14;-21,-28]));
+assert_checkequal(I8 + i8, int8([-16,-24;-32,-40]));
+assert_checkequal(I8 + I8, int8([-16,-32;-48,-64]));
+assert_checkequal(I8 + ui8, uint8([0,248;240,232]));
+assert_checkequal(I8 + UI8, uint8([0,0;0,0]));
+assert_checkequal(I8 + i16, int16([-24,-32;-40,-48]));
+assert_checkequal(I8 + I16, int16([-24,-48;-72,-96]));
+assert_checkequal(I8 + ui16, uint16([8,0;65528,65520]));
+assert_checkequal(I8 + UI16, uint16([8,16;24,32]));
+assert_checkequal(I8 + i32, int32([-40,-48;-56,-64]));
+assert_checkequal(I8 + I32, int32([-40,-80;-120,-160]));
+assert_checkequal(I8 + ui32, uint32([24,16;8,0]));
+assert_checkequal(I8 + UI32, uint32([24,48;72,96]));
+
+assert_checkequal(ui8 + empty, uint8(8));
+assert_checkequal(ui8 + r, uint8(10));
+assert_checkequal(ui8 + R, uint8([9,10;11,12]));
+assert_checkequal(ui8 + i8, uint8(0));
+assert_checkequal(ui8 + I8, uint8([0,248;240,232]));
+assert_checkequal(ui8 + ui8, uint8(16));
+assert_checkequal(ui8 + UI8, uint8([16,24;32,40]));
+assert_checkequal(ui8 + i16, uint16(65528));
+assert_checkequal(ui8 + I16, uint16([65528,65512;65496,65480]));
+assert_checkequal(ui8 + ui16, uint16(24));
+assert_checkequal(ui8 + UI16, uint16([24,40;56,72]));
+assert_checkequal(ui8 + i32, uint32(4294967272));
+assert_checkequal(ui8 + I32, uint32([4294967272,4294967240;4294967208,4294967176]));
+assert_checkequal(ui8 + ui32, uint32(40));
+assert_checkequal(ui8 + UI32, uint32([40,72;104,136]));
+
+assert_checkequal(UI8 + empty, uint8([8,16;24,32]));
+assert_checkequal(UI8 + r, uint8([10,18;26,34]));
+assert_checkequal(UI8 + R, uint8([9,18;27,36]));
+assert_checkequal(UI8 + i8, uint8([0,8;16,24]));
+assert_checkequal(UI8 + I8, uint8([0,0;0,0]));
+assert_checkequal(UI8 + ui8, uint8([16,24;32,40]));
+assert_checkequal(UI8 + UI8, uint8([16,32;48,64]));
+assert_checkequal(UI8 + i16, uint16([65528,0;8,16]));
+assert_checkequal(UI8 + I16, uint16([65528,65520;65512,65504]));
+assert_checkequal(UI8 + ui16, uint16([24,32;40,48]));
+assert_checkequal(UI8 + UI16, uint16([24,48;72,96]));
+assert_checkequal(UI8 + i32, uint32([4294967272,4294967280;4294967288,0]));
+assert_checkequal(UI8 + I32, uint32([4294967272,4294967248;4294967224,4294967200]));
+assert_checkequal(UI8 + ui32, uint32([40,48;56,64]));
+assert_checkequal(UI8 + UI32, uint32([40,80;120,160]));
+
+assert_checkequal(i16 + empty, int16(-16));
+assert_checkequal(i16 + r, int16(-14));
+assert_checkequal(i16 + R, int16([-15,-14;-13,-12]));
+assert_checkequal(i16 + i8, int16(-24));
+assert_checkequal(i16 + I8, int16([-24,-32;-40,-48]));
+assert_checkequal(i16 + ui8, uint16(65528));
+assert_checkequal(i16 + UI8, uint16([65528,0;8,16]));
+assert_checkequal(i16 + i16, int16(-32));
+assert_checkequal(i16 + I16, int16([-32,-48;-64,-80]));
+assert_checkequal(i16 + ui16, uint16(0));
+assert_checkequal(i16 + UI16, uint16([0,16;32,48]));
+assert_checkequal(i16 + i32, int32(-48));
+assert_checkequal(i16 + I32, int32([-48,-80;-112,-144]));
+assert_checkequal(i16 + ui32, uint32(16));
+assert_checkequal(i16 + UI32, uint32([16,48;80,112]));
+
+assert_checkequal(I16 + empty, int16([-16,-32;-48,-64]));
+assert_checkequal(I16 + r, int16([-14,-30;-46,-62]));
+assert_checkequal(I16 + R, int16([-15,-30;-45,-60]));
+assert_checkequal(I16 + i8, int16([-24,-40;-56,-72]));
+assert_checkequal(I16 + I8, int16([-24,-48;-72,-96]));
+assert_checkequal(I16 + ui8, uint16([65528,65512;65496,65480]));
+assert_checkequal(I16 + UI8, uint16([65528,65520;65512,65504]));
+assert_checkequal(I16 + i16, int16([-32,-48;-64,-80]));
+assert_checkequal(I16 + I16, int16([-32,-64;-96,-128]));
+assert_checkequal(I16 + ui16, uint16([0,65520;65504,65488]));
+assert_checkequal(I16 + UI16, uint16([0,0;0,0]));
+assert_checkequal(I16 + i32, int32([-48,-64;-80,-96]));
+assert_checkequal(I16 + I32, int32([-48,-96;-144,-192]));
+assert_checkequal(I16 + ui32, uint32([16,0;4294967280,4294967264]));
+assert_checkequal(I16 + UI32, uint32([16,32;48,64]));
+
+assert_checkequal(ui16 + empty, uint16(16));
+assert_checkequal(ui16 + r, uint16(18));
+assert_checkequal(ui16 + R, uint16([17,18;19,20]));
+assert_checkequal(ui16 + i8, uint16(8));
+assert_checkequal(ui16 + I8, uint16([8,0;65528,65520]));
+assert_checkequal(ui16 + ui8, uint16(24));
+assert_checkequal(ui16 + UI8, uint16([24,32;40,48]));
+assert_checkequal(ui16 + i16, uint16(0));
+assert_checkequal(ui16 + I16, uint16([0,65520;65504,65488]));
+assert_checkequal(ui16 + ui16, uint16(32));
+assert_checkequal(ui16 + UI16, uint16([32,48;64,80]));
+assert_checkequal(ui16 + i32, uint32(4294967280));
+assert_checkequal(ui16 + I32, uint32([4294967280,4294967248;4294967216,4294967184]));
+assert_checkequal(ui16 + ui32, uint32(48));
+assert_checkequal(ui16 + UI32, uint32([48,80;112,144]));
+
+assert_checkequal(UI16 + empty, uint16([16,32;48,64]));
+assert_checkequal(UI16 + r, uint16([18,34;50,66]));
+assert_checkequal(UI16 + R, uint16([17,34;51,68]));
+assert_checkequal(UI16 + i8, uint16([8,24;40,56]));
+assert_checkequal(UI16 + I8, uint16([8,16;24,32]));
+assert_checkequal(UI16 + ui8, uint16([24,40;56,72]));
+assert_checkequal(UI16 + UI8, uint16([24,48;72,96]));
+assert_checkequal(UI16 + i16, uint16([0,16;32,48]));
+assert_checkequal(UI16 + I16, uint16([0,0;0,0]));
+assert_checkequal(UI16 + ui16, uint16([32,48;64,80]));
+assert_checkequal(UI16 + UI16, uint16([32,64;96,128]));
+assert_checkequal(UI16 + i32, uint32([4294967280,0;16,32]));
+assert_checkequal(UI16 + I32, uint32([4294967280,4294967264;4294967248,4294967232]));
+assert_checkequal(UI16 + ui32, uint32([48,64;80,96]));
+assert_checkequal(UI16 + UI32, uint32([48,96;144,192]));
+
+assert_checkequal(i32 + empty, int32(-32));
+assert_checkequal(i32 + r, int32(-30));
+assert_checkequal(i32 + R, int32([-31,-30;-29,-28]));
+assert_checkequal(i32 + i8, int32(-40));
+assert_checkequal(i32 + I8, int32([-40,-48;-56,-64]));
+assert_checkequal(i32 + ui8, uint32(4294967272));
+assert_checkequal(i32 + UI8, uint32([4294967272,4294967280;4294967288,0]));
+assert_checkequal(i32 + i16, int32(-48));
+assert_checkequal(i32 + I16, int32([-48,-64;-80,-96]));
+assert_checkequal(i32 + ui16, uint32(4294967280));
+assert_checkequal(i32 + UI16, uint32([4294967280,0;16,32]));
+assert_checkequal(i32 + i32, int32(-64));
+assert_checkequal(i32 + I32, int32([-64,-96;-128,-160]));
+assert_checkequal(i32 + ui32, uint32(0));
+assert_checkequal(i32 + UI32, uint32([0,32;64,96]));
+
+assert_checkequal(I32 + empty, int32([-32,-64;-96,-128]));
+assert_checkequal(I32 + r, int32([-30,-62;-94,-126]));
+assert_checkequal(I32 + R, int32([-31,-62;-93,-124]));
+assert_checkequal(I32 + i8, int32([-40,-72;-104,-136]));
+assert_checkequal(I32 + I8, int32([-40,-80;-120,-160]));
+assert_checkequal(I32 + ui8, uint32([4294967272,4294967240;4294967208,4294967176]));
+assert_checkequal(I32 + UI8, uint32([4294967272,4294967248;4294967224,4294967200]));
+assert_checkequal(I32 + i16, int32([-48,-80;-112,-144]));
+assert_checkequal(I32 + I16, int32([-48,-96;-144,-192]));
+assert_checkequal(I32 + ui16, uint32([4294967280,4294967248;4294967216,4294967184]));
+assert_checkequal(I32 + UI16, uint32([4294967280,4294967264;4294967248,4294967232]));
+assert_checkequal(I32 + i32, int32([-64,-96;-128,-160]));
+assert_checkequal(I32 + I32, int32([-64,-128;-192,-256]));
+assert_checkequal(I32 + ui32, uint32([0,4294967264;4294967232,4294967200]));
+assert_checkequal(I32 + UI32, uint32([0,0;0,0]));
+
+assert_checkequal(ui32 + empty, uint32(32));
+assert_checkequal(ui32 + r, uint32(34));
+assert_checkequal(ui32 + R, uint32([33,34;35,36]));
+assert_checkequal(ui32 + i8, uint32(24));
+assert_checkequal(ui32 + I8, uint32([24,16;8,0]));
+assert_checkequal(ui32 + ui8, uint32(40));
+assert_checkequal(ui32 + UI8, uint32([40,48;56,64]));
+assert_checkequal(ui32 + i16, uint32(16));
+assert_checkequal(ui32 + I16, uint32([16,0;4294967280,4294967264]));
+assert_checkequal(ui32 + ui16, uint32(48));
+assert_checkequal(ui32 + UI16, uint32([48,64;80,96]));
+assert_checkequal(ui32 + i32, uint32(0));
+assert_checkequal(ui32 + I32, uint32([0,4294967264;4294967232,4294967200]));
+assert_checkequal(ui32 + ui32, uint32(64));
+assert_checkequal(ui32 + UI32, uint32([64,96;128,160]));
+
+assert_checkequal(UI32 + empty, uint32([32,64;96,128]));
+assert_checkequal(UI32 + r, uint32([34,66;98,130]));
+assert_checkequal(UI32 + R, uint32([33,66;99,132]));
+assert_checkequal(UI32 + i8, uint32([24,56;88,120]));
+assert_checkequal(UI32 + I8, uint32([24,48;72,96]));
+assert_checkequal(UI32 + ui8, uint32([40,72;104,136]));
+assert_checkequal(UI32 + UI8, uint32([40,80;120,160]));
+assert_checkequal(UI32 + i16, uint32([16,48;80,112]));
+assert_checkequal(UI32 + I16, uint32([16,32;48,64]));
+assert_checkequal(UI32 + ui16, uint32([48,80;112,144]));
+assert_checkequal(UI32 + UI16, uint32([48,96;144,192]));
+assert_checkequal(UI32 + i32, uint32([0,32;64,96]));
+assert_checkequal(UI32 + I32, uint32([0,0;0,0]));
+assert_checkequal(UI32 + ui32, uint32([64,96;128,160]));
+assert_checkequal(UI32 + UI32, uint32([64,128;192,256]));
+
+assert_checkequal(str + empty, "string");
+assert_checkequal(str + str, "stringstring");
+assert_checkequal(str + STR, ["stringstring1","stringstring2";"stringstring3","stringstring4"]);
+
+assert_checkequal(STR + empty, ["string1","string2";"string3","string4"]);
+assert_checkequal(STR + str, ["string1string","string2string";"string3string","string4string"]);
+assert_checkequal(STR + STR, ["string1string1","string2string2";"string3string3","string4string4"]);
diff --git a/scilab/modules/ast/tests/unit_tests/dotmultiplication.dia.ref b/scilab/modules/ast/tests/unit_tests/dotmultiplication.dia.ref
new file mode 100644 (file)
index 0000000..8313a8c
--- /dev/null
@@ -0,0 +1,356 @@
+// ============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// ============================================================================
+// <-- JVM NOT MANDATORY -->
+s = %s;
+empty = [];
+r = 2;
+R = [1,2;3,4];
+R3(:,:,1) = R;
+R3(:,:,2) = R';
+c = 1 + 2*%i;
+C = [1+2*%i,2+4*%i;3+6*%i,4+8*%i];
+C3(:,:,1) = C;
+C3(:,:,2) = C';
+e = eye();
+ec = (5+%i) * eye();
+p = 1 + %s - %s**2;
+pc = 1 + %s - %s**2 + ( 2 - 3 * %s + 4 * %s**2 ) * %i;
+P = [2*p, -3*p;4*p,-5*p];
+PC = [2*pc, -3*pc;4*pc,-5*pc];
+SP = sparse([1,2;4,5;3,10],[1,2,3]);
+SPC = sparse([1,2;4,5;3,10],[1,2,3]) * ( 1 + 4*%i);
+i8 = int8(-8);
+ui8 = uint8(8);
+I8 = int8([-8 -16 ; -24 -32]);
+UI8 = uint8([8 16 ; 24 32]);
+I16 = int16([-16 -32 ; -48 -64]);
+UI16 = uint16([16 32 ; 48 64]);
+i16 = int16(-16);
+ui16 = uint16(16);
+i32 = int32(-32);
+ui32 = uint32(32);
+I32 = int32([-32 -64 ; -96 -128]);
+UI32 = uint32([32 64 ; 96 128]);
+assert_checkequal(empty .* empty, []);
+assert_checkequal(empty .* r, []);
+assert_checkequal(empty .* c, []);
+assert_checkequal(empty .* R, []);
+assert_checkequal(empty .* C, []);
+assert_checkequal(empty .* e, []);
+assert_checkequal(empty .* ec, []);
+assert_checkequal(empty .* p, []);
+assert_checkequal(empty .* pc, []);
+assert_checkequal(empty .* P, []);
+assert_checkequal(empty .* PC, []);
+assert_checkequal(empty .* SP, []);
+assert_checkequal(empty .* SPC, []);
+assert_checkequal(r .* empty, []);
+assert_checkequal(r .* r, 4);
+assert_checkequal(r .* c,  2+%i*4);
+assert_checkequal(r .* R, [2,4;6,8]);
+assert_checkequal(r .* C, [ 2+%i*4, 4+%i*8; 6+%i*12, 8+%i*16]);
+assert_checkequal(r .* e, (2)*eye());
+assert_checkequal(r .* ec, ( 10+%i*2)*eye());
+assert_checkequal(r .* p, 2+2*s-2*s^2);
+assert_checkequal(r .* pc, 2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2);
+assert_checkequal(r .* P, [4+4*s-4*s^2,-6-6*s+6*s^2;8+8*s-8*s^2,-10-10*s+10*s^2]);
+assert_checkequal(r .* PC, [4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-6-%i*12+(-6+%i*18)*s+(6-%i*24)*s^2;8+%i*16+(8-%i*24)*s+(-8+%i*32)*s^2,-10-%i*20+(-10+%i*30)*s+(10-%i*40)*s^2]);
+assert_checkequal(r .* SP, sparse([1,2;3,10;4,5],[2;6;4],[4,10]));
+assert_checkequal(r .* SPC, sparse([1,2;3,10;4,5],[ 2+%i*8; 6+%i*24; 4+%i*16],[4,10]));
+assert_checkequal(r .* i8, int8(-16));
+assert_checkequal(r .* I8, int8([-16,-32;-48,-64]));
+assert_checkequal(r .* ui8, uint8(16));
+assert_checkequal(r .* UI8, uint8([16,32;48,64]));
+assert_checkequal(r .* i16, int16(-32));
+assert_checkequal(r .* I16, int16([-32,-64;-96,-128]));
+assert_checkequal(r .* ui16, uint16(32));
+assert_checkequal(r .* UI16, uint16([32,64;96,128]));
+assert_checkequal(r .* i32, int32(-64));
+assert_checkequal(r .* I32, int32([-64,-128;-192,-256]));
+assert_checkequal(r .* ui32, uint32(64));
+assert_checkequal(r .* UI32, uint32([64,128;192,256]));
+assert_checkequal(c .* empty, []);
+assert_checkequal(c .* r,  2+%i*4);
+assert_checkequal(c .* c, -3+%i*4);
+assert_checkequal(c .* R, [ 1+%i*2, 2+%i*4; 3+%i*6, 4+%i*8]);
+assert_checkequal(c .* C, [-3+%i*4,-6+%i*8;-9+%i*12,-12+%i*16]);
+assert_checkequal(c .* e, ( 1+%i*2)*eye());
+assert_checkequal(c .* ec, ( 3+%i*11)*eye());
+assert_checkequal(c .* p, 1+%i*2+(1+%i*2)*s+(-1-%i*2)*s^2);
+assert_checkequal(c .* pc, -3+%i*4+(7-%i)*s+(-9+%i*2)*s^2);
+assert_checkequal(c .* P, [2+%i*4+(2+%i*4)*s+(-2-%i*4)*s^2,-3-%i*6+(-3-%i*6)*s+(3+%i*6)*s^2;4+%i*8+(4+%i*8)*s+(-4-%i*8)*s^2,-5-%i*10+(-5-%i*10)*s+(5+%i*10)*s^2]);
+assert_checkequal(c .* PC, [-6+%i*8+(14-%i*2)*s+(-18+%i*4)*s^2,9-%i*12+(-21+%i*3)*s+(27-%i*6)*s^2;-12+%i*16+(28-%i*4)*s+(-36+%i*8)*s^2,15-%i*20+(-35+%i*5)*s+(45-%i*10)*s^2]);
+assert_checkequal(c .* SP, sparse([1,2;3,10;4,5],[ 1+%i*2; 3+%i*6; 2+%i*4],[4,10]));
+assert_checkequal(c .* SPC, sparse([1,2;3,10;4,5],[-7+%i*6;-21+%i*18;-14+%i*12],[4,10]));
+assert_checkequal(R .* empty, []);
+assert_checkequal(R .* r, [2,4;6,8]);
+assert_checkequal(R .* c, [ 1+%i*2, 2+%i*4; 3+%i*6, 4+%i*8]);
+assert_checkequal(R .* R, [1,4;9,16]);
+assert_checkequal(R .* C, [ 1+%i*2, 4+%i*8; 9+%i*18, 16+%i*32]);
+assert_checkequal(R .* p, [1+s-s^2,2+2*s-2*s^2;3+3*s-3*s^2,4+4*s-4*s^2]);
+assert_checkequal(R .* pc, [1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2;3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2,4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2]);
+assert_checkequal(R .* P, [2+2*s-2*s^2,-6-6*s+6*s^2;12+12*s-12*s^2,-20-20*s+20*s^2]);
+assert_checkequal(R .* PC, [2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-6-%i*12+(-6+%i*18)*s+(6-%i*24)*s^2;12+%i*24+(12-%i*36)*s+(-12+%i*48)*s^2,-20-%i*40+(-20+%i*60)*s+(20-%i*80)*s^2]);
+assert_checkequal(R .* i8, int8([-8,-16;-24,-32]));
+assert_checkequal(R .* I8, int8([-8,-32;-72,-128]));
+assert_checkequal(R .* ui8, uint8([8,16;24,32]));
+assert_checkequal(R .* UI8, uint8([8,32;72,128]));
+assert_checkequal(R .* i16, int16([-16,-32;-48,-64]));
+assert_checkequal(R .* I16, int16([-16,-64;-144,-256]));
+assert_checkequal(R .* ui16, uint16([16,32;48,64]));
+assert_checkequal(R .* UI16, uint16([16,64;144,256]));
+assert_checkequal(R .* i32, int32([-32,-64;-96,-128]));
+assert_checkequal(R .* I32, int32([-32,-128;-288,-512]));
+assert_checkequal(R .* ui32, uint32([32,64;96,128]));
+assert_checkequal(R .* UI32, uint32([32,128;288,512]));
+assert_checkequal(C .* empty, []);
+assert_checkequal(C .* r, [ 2+%i*4, 4+%i*8; 6+%i*12, 8+%i*16]);
+assert_checkequal(C .* c, [-3+%i*4,-6+%i*8;-9+%i*12,-12+%i*16]);
+assert_checkequal(C .* R, [ 1+%i*2, 4+%i*8; 9+%i*18, 16+%i*32]);
+assert_checkequal(C .* C, [-3+%i*4,-12+%i*16;-27+%i*36,-48+%i*64]);
+assert_checkequal(C .* p, [1+%i*2+(1+%i*2)*s+(-1-%i*2)*s^2,2+%i*4+(2+%i*4)*s+(-2-%i*4)*s^2;3+%i*6+(3+%i*6)*s+(-3-%i*6)*s^2,4+%i*8+(4+%i*8)*s+(-4-%i*8)*s^2]);
+assert_checkequal(C .* pc, [-3+%i*4+(7-%i)*s+(-9+%i*2)*s^2,-6+%i*8+(14-%i*2)*s+(-18+%i*4)*s^2;-9+%i*12+(21-%i*3)*s+(-27+%i*6)*s^2,-12+%i*16+(28-%i*4)*s+(-36+%i*8)*s^2]);
+assert_checkequal(C .* P, [2+%i*4+(2+%i*4)*s+(-2-%i*4)*s^2,-6-%i*12+(-6-%i*12)*s+(6+%i*12)*s^2;12+%i*24+(12+%i*24)*s+(-12-%i*24)*s^2,-20-%i*40+(-20-%i*40)*s+(20+%i*40)*s^2]);
+assert_checkequal(C .* PC, [-6+%i*8+(14-%i*2)*s+(-18+%i*4)*s^2,18-%i*24+(-42+%i*6)*s+(54-%i*12)*s^2;-36+%i*48+(84-%i*12)*s+(-108+%i*24)*s^2,60-%i*80+(-140+%i*20)*s+(180-%i*40)*s^2]);
+assert_checkequal(e .* empty, []);
+assert_checkequal(e .* r, (2)*eye());
+assert_checkequal(e .* c, ( 1+%i*2)*eye());
+assert_checkequal(e .* e, eye());
+assert_checkequal(e .* ec, ( 5+%i)*eye());
+assert_checkequal(e .* p, (1+s-s^2)*eye());
+assert_checkequal(e .* pc, (1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2)*eye());
+assert_checkequal(e .* i8, int8((-8)*eye()));
+assert_checkequal(e .* ui8, uint8((8)*eye()));
+assert_checkequal(e .* i16, int16((-16)*eye()));
+assert_checkequal(e .* ui16, uint16((16)*eye()));
+assert_checkequal(e .* i32, int32((-32)*eye()));
+assert_checkequal(e .* ui32, uint32((32)*eye()));
+assert_checkequal(ec .* empty, []);
+assert_checkequal(ec .* r, ( 10+%i*2)*eye());
+assert_checkequal(ec .* c, ( 3+%i*11)*eye());
+assert_checkequal(ec .* e, ( 5+%i)*eye());
+assert_checkequal(ec .* ec, ( 24+%i*10)*eye());
+assert_checkequal(ec .* p, (5+%i+(5+%i)*s+(-5-%i)*s^2)*eye());
+assert_checkequal(ec .* pc, (3+%i*11+(8-%i*14)*s+(-9+%i*19)*s^2)*eye());
+assert_checkequal(p .* empty, []);
+assert_checkequal(p .* r, 2+2*s-2*s^2);
+assert_checkequal(p .* c, 1+%i*2+(1+%i*2)*s+(-1-%i*2)*s^2);
+assert_checkequal(p .* R, [1+s-s^2,2+2*s-2*s^2;3+3*s-3*s^2,4+4*s-4*s^2]);
+assert_checkequal(p .* C, [1+%i*2+(1+%i*2)*s+(-1-%i*2)*s^2,2+%i*4+(2+%i*4)*s+(-2-%i*4)*s^2;3+%i*6+(3+%i*6)*s+(-3-%i*6)*s^2,4+%i*8+(4+%i*8)*s+(-4-%i*8)*s^2]);
+assert_checkequal(p .* e, (1+s-s^2)*eye());
+assert_checkequal(p .* ec, (5+%i+(5+%i)*s+(-5-%i)*s^2)*eye());
+assert_checkequal(p .* p, 1+2*s-s^2-2*s^3+s^4);
+assert_checkequal(p .* pc, 1+%i*2+(2-%i)*s+(-1-%i)*s^2+(-2+%i*7)*s^3+(1-%i*4)*s^4);
+assert_checkequal(p .* P, [2+4*s-2*s^2-4*s^3+2*s^4,-3-6*s+3*s^2+6*s^3-3*s^4;4+8*s-4*s^2-8*s^3+4*s^4,-5-10*s+5*s^2+10*s^3-5*s^4]);
+assert_checkequal(p .* PC, [2+%i*4+(4-%i*2)*s+(-2-%i*2)*s^2+(-4+%i*14)*s^3+(2-%i*8)*s^4,-3-%i*6+(-6+%i*3)*s+(3+%i*3)*s^2+(6-%i*21)*s^3+(-3+%i*12)*s^4;4+%i*8+(8-%i*4)*s+(-4-%i*4)*s^2+(-8+%i*28)*s^3+(4-%i*16)*s^4,-5-%i*10+(-10+%i*5)*s+(5+%i*5)*s^2+(10-%i*35)*s^3+(-5+%i*20)*s^4]);
+assert_checkequal(pc .* empty, []);
+assert_checkequal(pc .* r, 2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2);
+assert_checkequal(pc .* c, -3+%i*4+(7-%i)*s+(-9+%i*2)*s^2);
+assert_checkequal(pc .* R, [1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2;3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2,4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2]);
+assert_checkequal(pc .* C, [-3+%i*4+(7-%i)*s+(-9+%i*2)*s^2,-6+%i*8+(14-%i*2)*s+(-18+%i*4)*s^2;-9+%i*12+(21-%i*3)*s+(-27+%i*6)*s^2,-12+%i*16+(28-%i*4)*s+(-36+%i*8)*s^2]);
+assert_checkequal(pc .* e, (1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2)*eye());
+assert_checkequal(pc .* ec, (3+%i*11+(8-%i*14)*s+(-9+%i*19)*s^2)*eye());
+assert_checkequal(pc .* p, 1+%i*2+(2-%i)*s+(-1-%i)*s^2+(-2+%i*7)*s^3+(1-%i*4)*s^4);
+assert_checkequal(pc .* pc, -3+%i*4+(14-%i*2)*s+(-26-%i*2)*s^2+(22+%i*14)*s^3+(-15-%i*8)*s^4);
+assert_checkequal(pc .* P, [2+%i*4+(4-%i*2)*s+(-2-%i*2)*s^2+(-4+%i*14)*s^3+(2-%i*8)*s^4,-3-%i*6+(-6+%i*3)*s+(3+%i*3)*s^2+(6-%i*21)*s^3+(-3+%i*12)*s^4;4+%i*8+(8-%i*4)*s+(-4-%i*4)*s^2+(-8+%i*28)*s^3+(4-%i*16)*s^4,-5-%i*10+(-10+%i*5)*s+(5+%i*5)*s^2+(10-%i*35)*s^3+(-5+%i*20)*s^4]);
+assert_checkequal(pc .* PC, [-6+%i*8+(28-%i*4)*s+(-52-%i*4)*s^2+(44+%i*28)*s^3+(-30-%i*16)*s^4,9-%i*12+(-42+%i*6)*s+(78+%i*6)*s^2+(-66-%i*42)*s^3+(45+%i*24)*s^4;-12+%i*16+(56-%i*8)*s+(-104-%i*8)*s^2+(88+%i*56)*s^3+(-60-%i*32)*s^4,15-%i*20+(-70+%i*10)*s+(130+%i*10)*s^2+(-110-%i*70)*s^3+(75+%i*40)*s^4]);
+assert_checkequal(P .* empty, []);
+assert_checkequal(P .* r, [4+4*s-4*s^2,-6-6*s+6*s^2;8+8*s-8*s^2,-10-10*s+10*s^2]);
+assert_checkequal(P .* c, [2+%i*4+(2+%i*4)*s+(-2-%i*4)*s^2,-3-%i*6+(-3-%i*6)*s+(3+%i*6)*s^2;4+%i*8+(4+%i*8)*s+(-4-%i*8)*s^2,-5-%i*10+(-5-%i*10)*s+(5+%i*10)*s^2]);
+assert_checkequal(P .* R, [2+2*s-2*s^2,-6-6*s+6*s^2;12+12*s-12*s^2,-20-20*s+20*s^2]);
+assert_checkequal(P .* C, [2+%i*4+(2+%i*4)*s+(-2-%i*4)*s^2,-6-%i*12+(-6-%i*12)*s+(6+%i*12)*s^2;12+%i*24+(12+%i*24)*s+(-12-%i*24)*s^2,-20-%i*40+(-20-%i*40)*s+(20+%i*40)*s^2]);
+assert_checkequal(P .* p, [2+4*s-2*s^2-4*s^3+2*s^4,-3-6*s+3*s^2+6*s^3-3*s^4;4+8*s-4*s^2-8*s^3+4*s^4,-5-10*s+5*s^2+10*s^3-5*s^4]);
+assert_checkequal(P .* pc, [2+%i*4+(4-%i*2)*s+(-2-%i*2)*s^2+(-4+%i*14)*s^3+(2-%i*8)*s^4,-3-%i*6+(-6+%i*3)*s+(3+%i*3)*s^2+(6-%i*21)*s^3+(-3+%i*12)*s^4;4+%i*8+(8-%i*4)*s+(-4-%i*4)*s^2+(-8+%i*28)*s^3+(4-%i*16)*s^4,-5-%i*10+(-10+%i*5)*s+(5+%i*5)*s^2+(10-%i*35)*s^3+(-5+%i*20)*s^4]);
+assert_checkequal(P .* P, [4+8*s-4*s^2-8*s^3+4*s^4,9+18*s-9*s^2-18*s^3+9*s^4;16+32*s-16*s^2-32*s^3+16*s^4,25+50*s-25*s^2-50*s^3+25*s^4]);
+assert_checkequal(P .* PC, [4+%i*8+(8-%i*4)*s+(-4-%i*4)*s^2+(-8+%i*28)*s^3+(4-%i*16)*s^4,9+%i*18+(18-%i*9)*s+(-9-%i*9)*s^2+(-18+%i*63)*s^3+(9-%i*36)*s^4;16+%i*32+(32-%i*16)*s+(-16-%i*16)*s^2+(-32+%i*112)*s^3+(16-%i*64)*s^4,25+%i*50+(50-%i*25)*s+(-25-%i*25)*s^2+(-50+%i*175)*s^3+(25-%i*100)*s^4]);
+assert_checkequal(PC .* empty, []);
+assert_checkequal(PC .* r, [4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-6-%i*12+(-6+%i*18)*s+(6-%i*24)*s^2;8+%i*16+(8-%i*24)*s+(-8+%i*32)*s^2,-10-%i*20+(-10+%i*30)*s+(10-%i*40)*s^2]);
+assert_checkequal(PC .* c, [-6+%i*8+(14-%i*2)*s+(-18+%i*4)*s^2,9-%i*12+(-21+%i*3)*s+(27-%i*6)*s^2;-12+%i*16+(28-%i*4)*s+(-36+%i*8)*s^2,15-%i*20+(-35+%i*5)*s+(45-%i*10)*s^2]);
+assert_checkequal(PC .* R, [2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-6-%i*12+(-6+%i*18)*s+(6-%i*24)*s^2;12+%i*24+(12-%i*36)*s+(-12+%i*48)*s^2,-20-%i*40+(-20+%i*60)*s+(20-%i*80)*s^2]);
+assert_checkequal(PC .* C, [-6+%i*8+(14-%i*2)*s+(-18+%i*4)*s^2,18-%i*24+(-42+%i*6)*s+(54-%i*12)*s^2;-36+%i*48+(84-%i*12)*s+(-108+%i*24)*s^2,60-%i*80+(-140+%i*20)*s+(180-%i*40)*s^2]);
+assert_checkequal(PC .* p, [2+%i*4+(4-%i*2)*s+(-2-%i*2)*s^2+(-4+%i*14)*s^3+(2-%i*8)*s^4,-3-%i*6+(-6+%i*3)*s+(3+%i*3)*s^2+(6-%i*21)*s^3+(-3+%i*12)*s^4;4+%i*8+(8-%i*4)*s+(-4-%i*4)*s^2+(-8+%i*28)*s^3+(4-%i*16)*s^4,-5-%i*10+(-10+%i*5)*s+(5+%i*5)*s^2+(10-%i*35)*s^3+(-5+%i*20)*s^4]);
+assert_checkequal(PC .* pc, [-6+%i*8+(28-%i*4)*s+(-52-%i*4)*s^2+(44+%i*28)*s^3+(-30-%i*16)*s^4,9-%i*12+(-42+%i*6)*s+(78+%i*6)*s^2+(-66-%i*42)*s^3+(45+%i*24)*s^4;-12+%i*16+(56-%i*8)*s+(-104-%i*8)*s^2+(88+%i*56)*s^3+(-60-%i*32)*s^4,15-%i*20+(-70+%i*10)*s+(130+%i*10)*s^2+(-110-%i*70)*s^3+(75+%i*40)*s^4]);
+assert_checkequal(PC .* P, [4+%i*8+(8-%i*4)*s+(-4-%i*4)*s^2+(-8+%i*28)*s^3+(4-%i*16)*s^4,9+%i*18+(18-%i*9)*s+(-9-%i*9)*s^2+(-18+%i*63)*s^3+(9-%i*36)*s^4;16+%i*32+(32-%i*16)*s+(-16-%i*16)*s^2+(-32+%i*112)*s^3+(16-%i*64)*s^4,25+%i*50+(50-%i*25)*s+(-25-%i*25)*s^2+(-50+%i*175)*s^3+(25-%i*100)*s^4]);
+assert_checkequal(PC .* PC, [-12+%i*16+(56-%i*8)*s+(-104-%i*8)*s^2+(88+%i*56)*s^3+(-60-%i*32)*s^4,-27+%i*36+(126-%i*18)*s+(-234-%i*18)*s^2+(198+%i*126)*s^3+(-135-%i*72)*s^4;-48+%i*64+(224-%i*32)*s+(-416-%i*32)*s^2+(352+%i*224)*s^3+(-240-%i*128)*s^4,-75+%i*100+(350-%i*50)*s+(-650-%i*50)*s^2+(550+%i*350)*s^3+(-375-%i*200)*s^4]);
+assert_checkequal(SP .* empty, []);
+assert_checkequal(SP .* r, sparse([1,2;3,10;4,5],[2;6;4],[4,10]));
+assert_checkequal(SP .* c, sparse([1,2;3,10;4,5],[ 1+%i*2; 3+%i*6; 2+%i*4],[4,10]));
+assert_checkequal(SP .* SP, sparse([1,2;3,10;4,5],[1;9;4],[4,10]));
+assert_checkequal(SP .* SPC, sparse([1,2;3,10;4,5],[ 1+%i*4; 9+%i*36; 4+%i*16],[4,10]));
+assert_checkequal(SPC .* empty, []);
+assert_checkequal(SPC .* r, sparse([1,2;3,10;4,5],[ 2+%i*8; 6+%i*24; 4+%i*16],[4,10]));
+assert_checkequal(SPC .* c, sparse([1,2;3,10;4,5],[-7+%i*6;-21+%i*18;-14+%i*12],[4,10]));
+assert_checkequal(SPC .* SP, sparse([1,2;3,10;4,5],[ 1+%i*4; 9+%i*36; 4+%i*16],[4,10]));
+assert_checkequal(SPC .* SPC, sparse([1,2;3,10;4,5],[-15+%i*8;-135+%i*72;-60+%i*32],[4,10]));
+assert_checkequal(i8 .* r, int8(-16));
+assert_checkequal(i8 .* R, int8([-8,-16;-24,-32]));
+assert_checkequal(i8 .* i8, int8(64));
+assert_checkequal(i8 .* I8, int8([64,-128;-64,0]));
+assert_checkequal(i8 .* ui8, uint8(192));
+assert_checkequal(i8 .* UI8, uint8([192,128;64,0]));
+assert_checkequal(i8 .* i16, int16(128));
+assert_checkequal(i8 .* I16, int16([128,256;384,512]));
+assert_checkequal(i8 .* ui16, uint16(65408));
+assert_checkequal(i8 .* UI16, uint16([65408,65280;65152,65024]));
+assert_checkequal(i8 .* i32, int32(256));
+assert_checkequal(i8 .* I32, int32([256,512;768,1024]));
+assert_checkequal(i8 .* ui32, uint32(4294967040));
+assert_checkequal(i8 .* UI32, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(I8 .* r, int8([-16,-32;-48,-64]));
+assert_checkequal(I8 .* R, int8([-8,-32;-72,-128]));
+assert_checkequal(I8 .* i8, int8([64,-128;-64,0]));
+assert_checkequal(I8 .* I8, int8([64,0;64,0]));
+assert_checkequal(I8 .* ui8, uint8([192,128;64,0]));
+assert_checkequal(I8 .* UI8, uint8([192,0;192,0]));
+assert_checkequal(I8 .* i16, int16([128,256;384,512]));
+assert_checkequal(I8 .* I16, int16([128,512;1152,2048]));
+assert_checkequal(I8 .* ui16, uint16([65408,65280;65152,65024]));
+assert_checkequal(I8 .* UI16, uint16([65408,65024;64384,63488]));
+assert_checkequal(I8 .* i32, int32([256,512;768,1024]));
+assert_checkequal(I8 .* I32, int32([256,1024;2304,4096]));
+assert_checkequal(I8 .* ui32, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(I8 .* UI32, uint32([4294967040,4294966272;4294964992,4294963200]));
+assert_checkequal(ui8 .* r, uint8(16));
+assert_checkequal(ui8 .* R, uint8([8,16;24,32]));
+assert_checkequal(ui8 .* i8, uint8(192));
+assert_checkequal(ui8 .* I8, uint8([192,128;64,0]));
+assert_checkequal(ui8 .* ui8, uint8(64));
+assert_checkequal(ui8 .* UI8, uint8([64,128;192,0]));
+assert_checkequal(ui8 .* i16, uint16(65408));
+assert_checkequal(ui8 .* I16, uint16([65408,65280;65152,65024]));
+assert_checkequal(ui8 .* ui16, uint16(128));
+assert_checkequal(ui8 .* UI16, uint16([128,256;384,512]));
+assert_checkequal(ui8 .* i32, uint32(4294967040));
+assert_checkequal(ui8 .* I32, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(ui8 .* ui32, uint32(256));
+assert_checkequal(ui8 .* UI32, uint32([256,512;768,1024]));
+assert_checkequal(UI8 .* r, uint8([16,32;48,64]));
+assert_checkequal(UI8 .* R, uint8([8,32;72,128]));
+assert_checkequal(UI8 .* i8, uint8([192,128;64,0]));
+assert_checkequal(UI8 .* I8, uint8([192,0;192,0]));
+assert_checkequal(UI8 .* ui8, uint8([64,128;192,0]));
+assert_checkequal(UI8 .* UI8, uint8([64,0;64,0]));
+assert_checkequal(UI8 .* i16, uint16([65408,65280;65152,65024]));
+assert_checkequal(UI8 .* I16, uint16([65408,65024;64384,63488]));
+assert_checkequal(UI8 .* ui16, uint16([128,256;384,512]));
+assert_checkequal(UI8 .* UI16, uint16([128,512;1152,2048]));
+assert_checkequal(UI8 .* i32, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(UI8 .* I32, uint32([4294967040,4294966272;4294964992,4294963200]));
+assert_checkequal(UI8 .* ui32, uint32([256,512;768,1024]));
+assert_checkequal(UI8 .* UI32, uint32([256,1024;2304,4096]));
+assert_checkequal(i16 .* r, int16(-32));
+assert_checkequal(i16 .* R, int16([-16,-32;-48,-64]));
+assert_checkequal(i16 .* i8, int16(128));
+assert_checkequal(i16 .* I8, int16([128,256;384,512]));
+assert_checkequal(i16 .* ui8, uint16(65408));
+assert_checkequal(i16 .* UI8, uint16([65408,65280;65152,65024]));
+assert_checkequal(i16 .* i16, int16(256));
+assert_checkequal(i16 .* I16, int16([256,512;768,1024]));
+assert_checkequal(i16 .* ui16, uint16(65280));
+assert_checkequal(i16 .* UI16, uint16([65280,65024;64768,64512]));
+assert_checkequal(i16 .* i32, int32(512));
+assert_checkequal(i16 .* I32, int32([512,1024;1536,2048]));
+assert_checkequal(i16 .* ui32, uint32(4294966784));
+assert_checkequal(i16 .* UI32, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(I16 .* r, int16([-32,-64;-96,-128]));
+assert_checkequal(I16 .* R, int16([-16,-64;-144,-256]));
+assert_checkequal(I16 .* i8, int16([128,256;384,512]));
+assert_checkequal(I16 .* I8, int16([128,512;1152,2048]));
+assert_checkequal(I16 .* ui8, uint16([65408,65280;65152,65024]));
+assert_checkequal(I16 .* UI8, uint16([65408,65024;64384,63488]));
+assert_checkequal(I16 .* i16, int16([256,512;768,1024]));
+assert_checkequal(I16 .* I16, int16([256,1024;2304,4096]));
+assert_checkequal(I16 .* ui16, uint16([65280,65024;64768,64512]));
+assert_checkequal(I16 .* UI16, uint16([65280,64512;63232,61440]));
+assert_checkequal(I16 .* i32, int32([512,1024;1536,2048]));
+assert_checkequal(I16 .* I32, int32([512,2048;4608,8192]));
+assert_checkequal(I16 .* ui32, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(I16 .* UI32, uint32([4294966784,4294965248;4294962688,4294959104]));
+assert_checkequal(ui16 .* r, uint16(32));
+assert_checkequal(ui16 .* R, uint16([16,32;48,64]));
+assert_checkequal(ui16 .* i8, uint16(65408));
+assert_checkequal(ui16 .* I8, uint16([65408,65280;65152,65024]));
+assert_checkequal(ui16 .* ui8, uint16(128));
+assert_checkequal(ui16 .* UI8, uint16([128,256;384,512]));
+assert_checkequal(ui16 .* i16, uint16(65280));
+assert_checkequal(ui16 .* I16, uint16([65280,65024;64768,64512]));
+assert_checkequal(ui16 .* ui16, uint16(256));
+assert_checkequal(ui16 .* UI16, uint16([256,512;768,1024]));
+assert_checkequal(ui16 .* i32, uint32(4294966784));
+assert_checkequal(ui16 .* I32, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(ui16 .* ui32, uint32(512));
+assert_checkequal(ui16 .* UI32, uint32([512,1024;1536,2048]));
+assert_checkequal(UI16 .* r, uint16([32,64;96,128]));
+assert_checkequal(UI16 .* R, uint16([16,64;144,256]));
+assert_checkequal(UI16 .* i8, uint16([65408,65280;65152,65024]));
+assert_checkequal(UI16 .* I8, uint16([65408,65024;64384,63488]));
+assert_checkequal(UI16 .* ui8, uint16([128,256;384,512]));
+assert_checkequal(UI16 .* UI8, uint16([128,512;1152,2048]));
+assert_checkequal(UI16 .* i16, uint16([65280,65024;64768,64512]));
+assert_checkequal(UI16 .* I16, uint16([65280,64512;63232,61440]));
+assert_checkequal(UI16 .* ui16, uint16([256,512;768,1024]));
+assert_checkequal(UI16 .* UI16, uint16([256,1024;2304,4096]));
+assert_checkequal(UI16 .* i32, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(UI16 .* I32, uint32([4294966784,4294965248;4294962688,4294959104]));
+assert_checkequal(UI16 .* ui32, uint32([512,1024;1536,2048]));
+assert_checkequal(UI16 .* UI32, uint32([512,2048;4608,8192]));
+assert_checkequal(i32 .* r, int32(-64));
+assert_checkequal(i32 .* R, int32([-32,-64;-96,-128]));
+assert_checkequal(i32 .* i8, int32(256));
+assert_checkequal(i32 .* I8, int32([256,512;768,1024]));
+assert_checkequal(i32 .* ui8, uint32(4294967040));
+assert_checkequal(i32 .* UI8, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(i32 .* i16, int32(512));
+assert_checkequal(i32 .* I16, int32([512,1024;1536,2048]));
+assert_checkequal(i32 .* ui16, uint32(4294966784));
+assert_checkequal(i32 .* UI16, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(i32 .* i32, int32(1024));
+assert_checkequal(i32 .* I32, int32([1024,2048;3072,4096]));
+assert_checkequal(i32 .* ui32, uint32(4294966272));
+assert_checkequal(i32 .* UI32, uint32([4294966272,4294965248;4294964224,4294963200]));
+assert_checkequal(I32 .* r, int32([-64,-128;-192,-256]));
+assert_checkequal(I32 .* R, int32([-32,-128;-288,-512]));
+assert_checkequal(I32 .* i8, int32([256,512;768,1024]));
+assert_checkequal(I32 .* I8, int32([256,1024;2304,4096]));
+assert_checkequal(I32 .* ui8, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(I32 .* UI8, uint32([4294967040,4294966272;4294964992,4294963200]));
+assert_checkequal(I32 .* i16, int32([512,1024;1536,2048]));
+assert_checkequal(I32 .* I16, int32([512,2048;4608,8192]));
+assert_checkequal(I32 .* ui16, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(I32 .* UI16, uint32([4294966784,4294965248;4294962688,4294959104]));
+assert_checkequal(I32 .* i32, int32([1024,2048;3072,4096]));
+assert_checkequal(I32 .* I32, int32([1024,4096;9216,16384]));
+assert_checkequal(I32 .* ui32, uint32([4294966272,4294965248;4294964224,4294963200]));
+assert_checkequal(I32 .* UI32, uint32([4294966272,4294963200;4294958080,4294950912]));
+assert_checkequal(ui32 .* r, uint32(64));
+assert_checkequal(ui32 .* R, uint32([32,64;96,128]));
+assert_checkequal(ui32 .* i8, uint32(4294967040));
+assert_checkequal(ui32 .* I8, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(ui32 .* ui8, uint32(256));
+assert_checkequal(ui32 .* UI8, uint32([256,512;768,1024]));
+assert_checkequal(ui32 .* i16, uint32(4294966784));
+assert_checkequal(ui32 .* I16, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(ui32 .* ui16, uint32(512));
+assert_checkequal(ui32 .* UI16, uint32([512,1024;1536,2048]));
+assert_checkequal(ui32 .* i32, uint32(4294966272));
+assert_checkequal(ui32 .* I32, uint32([4294966272,4294965248;4294964224,4294963200]));
+assert_checkequal(ui32 .* ui32, uint32(1024));
+assert_checkequal(ui32 .* UI32, uint32([1024,2048;3072,4096]));
+assert_checkequal(UI32 .* r, uint32([64,128;192,256]));
+assert_checkequal(UI32 .* R, uint32([32,128;288,512]));
+assert_checkequal(UI32 .* i8, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(UI32 .* I8, uint32([4294967040,4294966272;4294964992,4294963200]));
+assert_checkequal(UI32 .* ui8, uint32([256,512;768,1024]));
+assert_checkequal(UI32 .* UI8, uint32([256,1024;2304,4096]));
+assert_checkequal(UI32 .* i16, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(UI32 .* I16, uint32([4294966784,4294965248;4294962688,4294959104]));
+assert_checkequal(UI32 .* ui16, uint32([512,1024;1536,2048]));
+assert_checkequal(UI32 .* UI16, uint32([512,2048;4608,8192]));
+assert_checkequal(UI32 .* i32, uint32([4294966272,4294965248;4294964224,4294963200]));
+assert_checkequal(UI32 .* I32, uint32([4294966272,4294963200;4294958080,4294950912]));
+assert_checkequal(UI32 .* ui32, uint32([1024,2048;3072,4096]));
+assert_checkequal(UI32 .* UI32, uint32([1024,4096;9216,16384]));
diff --git a/scilab/modules/ast/tests/unit_tests/dotmultiplication.tst b/scilab/modules/ast/tests/unit_tests/dotmultiplication.tst
new file mode 100644 (file)
index 0000000..47e5322
--- /dev/null
@@ -0,0 +1,386 @@
+// ============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// ============================================================================
+
+// <-- JVM NOT MANDATORY -->
+
+s = %s;
+empty = [];
+r = 2;
+R = [1,2;3,4];
+R3(:,:,1) = R;
+R3(:,:,2) = R';
+c = 1 + 2*%i;
+C = [1+2*%i,2+4*%i;3+6*%i,4+8*%i];
+C3(:,:,1) = C;
+C3(:,:,2) = C';
+e = eye();
+ec = (5+%i) * eye();
+p = 1 + %s - %s**2;
+pc = 1 + %s - %s**2 + ( 2 - 3 * %s + 4 * %s**2 ) * %i;
+P = [2*p, -3*p;4*p,-5*p];
+PC = [2*pc, -3*pc;4*pc,-5*pc];
+SP = sparse([1,2;4,5;3,10],[1,2,3]);
+SPC = sparse([1,2;4,5;3,10],[1,2,3]) * ( 1 + 4*%i);
+
+i8 = int8(-8);
+ui8 = uint8(8);
+I8 = int8([-8 -16 ; -24 -32]);
+UI8 = uint8([8 16 ; 24 32]);
+
+I16 = int16([-16 -32 ; -48 -64]);
+UI16 = uint16([16 32 ; 48 64]);
+i16 = int16(-16);
+ui16 = uint16(16);
+
+i32 = int32(-32);
+ui32 = uint32(32);
+I32 = int32([-32 -64 ; -96 -128]);
+UI32 = uint32([32 64 ; 96 128]);
+
+assert_checkequal(empty .* empty, []);
+assert_checkequal(empty .* r, []);
+assert_checkequal(empty .* c, []);
+assert_checkequal(empty .* R, []);
+assert_checkequal(empty .* C, []);
+assert_checkequal(empty .* e, []);
+assert_checkequal(empty .* ec, []);
+assert_checkequal(empty .* p, []);
+assert_checkequal(empty .* pc, []);
+assert_checkequal(empty .* P, []);
+assert_checkequal(empty .* PC, []);
+assert_checkequal(empty .* SP, []);
+assert_checkequal(empty .* SPC, []);
+
+assert_checkequal(r .* empty, []);
+assert_checkequal(r .* r, 4);
+assert_checkequal(r .* c,  2+%i*4);
+assert_checkequal(r .* R, [2,4;6,8]);
+assert_checkequal(r .* C, [ 2+%i*4, 4+%i*8; 6+%i*12, 8+%i*16]);
+assert_checkequal(r .* e, (2)*eye());
+assert_checkequal(r .* ec, ( 10+%i*2)*eye());
+assert_checkequal(r .* p, 2+2*s-2*s^2);
+assert_checkequal(r .* pc, 2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2);
+assert_checkequal(r .* P, [4+4*s-4*s^2,-6-6*s+6*s^2;8+8*s-8*s^2,-10-10*s+10*s^2]);
+assert_checkequal(r .* PC, [4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-6-%i*12+(-6+%i*18)*s+(6-%i*24)*s^2;8+%i*16+(8-%i*24)*s+(-8+%i*32)*s^2,-10-%i*20+(-10+%i*30)*s+(10-%i*40)*s^2]);
+assert_checkequal(r .* SP, sparse([1,2;3,10;4,5],[2;6;4],[4,10]));
+assert_checkequal(r .* SPC, sparse([1,2;3,10;4,5],[ 2+%i*8; 6+%i*24; 4+%i*16],[4,10]));
+assert_checkequal(r .* i8, int8(-16));
+assert_checkequal(r .* I8, int8([-16,-32;-48,-64]));
+assert_checkequal(r .* ui8, uint8(16));
+assert_checkequal(r .* UI8, uint8([16,32;48,64]));
+assert_checkequal(r .* i16, int16(-32));
+assert_checkequal(r .* I16, int16([-32,-64;-96,-128]));
+assert_checkequal(r .* ui16, uint16(32));
+assert_checkequal(r .* UI16, uint16([32,64;96,128]));
+assert_checkequal(r .* i32, int32(-64));
+assert_checkequal(r .* I32, int32([-64,-128;-192,-256]));
+assert_checkequal(r .* ui32, uint32(64));
+assert_checkequal(r .* UI32, uint32([64,128;192,256]));
+
+assert_checkequal(c .* empty, []);
+assert_checkequal(c .* r,  2+%i*4);
+assert_checkequal(c .* c, -3+%i*4);
+assert_checkequal(c .* R, [ 1+%i*2, 2+%i*4; 3+%i*6, 4+%i*8]);
+assert_checkequal(c .* C, [-3+%i*4,-6+%i*8;-9+%i*12,-12+%i*16]);
+assert_checkequal(c .* e, ( 1+%i*2)*eye());
+assert_checkequal(c .* ec, ( 3+%i*11)*eye());
+assert_checkequal(c .* p, 1+%i*2+(1+%i*2)*s+(-1-%i*2)*s^2);
+assert_checkequal(c .* pc, -3+%i*4+(7-%i)*s+(-9+%i*2)*s^2);
+assert_checkequal(c .* P, [2+%i*4+(2+%i*4)*s+(-2-%i*4)*s^2,-3-%i*6+(-3-%i*6)*s+(3+%i*6)*s^2;4+%i*8+(4+%i*8)*s+(-4-%i*8)*s^2,-5-%i*10+(-5-%i*10)*s+(5+%i*10)*s^2]);
+assert_checkequal(c .* PC, [-6+%i*8+(14-%i*2)*s+(-18+%i*4)*s^2,9-%i*12+(-21+%i*3)*s+(27-%i*6)*s^2;-12+%i*16+(28-%i*4)*s+(-36+%i*8)*s^2,15-%i*20+(-35+%i*5)*s+(45-%i*10)*s^2]);
+assert_checkequal(c .* SP, sparse([1,2;3,10;4,5],[ 1+%i*2; 3+%i*6; 2+%i*4],[4,10]));
+assert_checkequal(c .* SPC, sparse([1,2;3,10;4,5],[-7+%i*6;-21+%i*18;-14+%i*12],[4,10]));
+
+assert_checkequal(R .* empty, []);
+assert_checkequal(R .* r, [2,4;6,8]);
+assert_checkequal(R .* c, [ 1+%i*2, 2+%i*4; 3+%i*6, 4+%i*8]);
+assert_checkequal(R .* R, [1,4;9,16]);
+assert_checkequal(R .* C, [ 1+%i*2, 4+%i*8; 9+%i*18, 16+%i*32]);
+assert_checkequal(R .* p, [1+s-s^2,2+2*s-2*s^2;3+3*s-3*s^2,4+4*s-4*s^2]);
+assert_checkequal(R .* pc, [1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2;3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2,4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2]);
+assert_checkequal(R .* P, [2+2*s-2*s^2,-6-6*s+6*s^2;12+12*s-12*s^2,-20-20*s+20*s^2]);
+assert_checkequal(R .* PC, [2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-6-%i*12+(-6+%i*18)*s+(6-%i*24)*s^2;12+%i*24+(12-%i*36)*s+(-12+%i*48)*s^2,-20-%i*40+(-20+%i*60)*s+(20-%i*80)*s^2]);
+assert_checkequal(R .* i8, int8([-8,-16;-24,-32]));
+assert_checkequal(R .* I8, int8([-8,-32;-72,-128]));
+assert_checkequal(R .* ui8, uint8([8,16;24,32]));
+assert_checkequal(R .* UI8, uint8([8,32;72,128]));
+assert_checkequal(R .* i16, int16([-16,-32;-48,-64]));
+assert_checkequal(R .* I16, int16([-16,-64;-144,-256]));
+assert_checkequal(R .* ui16, uint16([16,32;48,64]));
+assert_checkequal(R .* UI16, uint16([16,64;144,256]));
+assert_checkequal(R .* i32, int32([-32,-64;-96,-128]));
+assert_checkequal(R .* I32, int32([-32,-128;-288,-512]));
+assert_checkequal(R .* ui32, uint32([32,64;96,128]));
+assert_checkequal(R .* UI32, uint32([32,128;288,512]));
+
+assert_checkequal(C .* empty, []);
+assert_checkequal(C .* r, [ 2+%i*4, 4+%i*8; 6+%i*12, 8+%i*16]);
+assert_checkequal(C .* c, [-3+%i*4,-6+%i*8;-9+%i*12,-12+%i*16]);
+assert_checkequal(C .* R, [ 1+%i*2, 4+%i*8; 9+%i*18, 16+%i*32]);
+assert_checkequal(C .* C, [-3+%i*4,-12+%i*16;-27+%i*36,-48+%i*64]);
+assert_checkequal(C .* p, [1+%i*2+(1+%i*2)*s+(-1-%i*2)*s^2,2+%i*4+(2+%i*4)*s+(-2-%i*4)*s^2;3+%i*6+(3+%i*6)*s+(-3-%i*6)*s^2,4+%i*8+(4+%i*8)*s+(-4-%i*8)*s^2]);
+assert_checkequal(C .* pc, [-3+%i*4+(7-%i)*s+(-9+%i*2)*s^2,-6+%i*8+(14-%i*2)*s+(-18+%i*4)*s^2;-9+%i*12+(21-%i*3)*s+(-27+%i*6)*s^2,-12+%i*16+(28-%i*4)*s+(-36+%i*8)*s^2]);
+assert_checkequal(C .* P, [2+%i*4+(2+%i*4)*s+(-2-%i*4)*s^2,-6-%i*12+(-6-%i*12)*s+(6+%i*12)*s^2;12+%i*24+(12+%i*24)*s+(-12-%i*24)*s^2,-20-%i*40+(-20-%i*40)*s+(20+%i*40)*s^2]);
+assert_checkequal(C .* PC, [-6+%i*8+(14-%i*2)*s+(-18+%i*4)*s^2,18-%i*24+(-42+%i*6)*s+(54-%i*12)*s^2;-36+%i*48+(84-%i*12)*s+(-108+%i*24)*s^2,60-%i*80+(-140+%i*20)*s+(180-%i*40)*s^2]);
+
+assert_checkequal(e .* empty, []);
+assert_checkequal(e .* r, (2)*eye());
+assert_checkequal(e .* c, ( 1+%i*2)*eye());
+assert_checkequal(e .* e, eye());
+assert_checkequal(e .* ec, ( 5+%i)*eye());
+assert_checkequal(e .* p, (1+s-s^2)*eye());
+assert_checkequal(e .* pc, (1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2)*eye());
+assert_checkequal(e .* i8, int8((-8)*eye()));
+assert_checkequal(e .* ui8, uint8((8)*eye()));
+assert_checkequal(e .* i16, int16((-16)*eye()));
+assert_checkequal(e .* ui16, uint16((16)*eye()));
+assert_checkequal(e .* i32, int32((-32)*eye()));
+assert_checkequal(e .* ui32, uint32((32)*eye()));
+
+assert_checkequal(ec .* empty, []);
+assert_checkequal(ec .* r, ( 10+%i*2)*eye());
+assert_checkequal(ec .* c, ( 3+%i*11)*eye());
+assert_checkequal(ec .* e, ( 5+%i)*eye());
+assert_checkequal(ec .* ec, ( 24+%i*10)*eye());
+assert_checkequal(ec .* p, (5+%i+(5+%i)*s+(-5-%i)*s^2)*eye());
+assert_checkequal(ec .* pc, (3+%i*11+(8-%i*14)*s+(-9+%i*19)*s^2)*eye());
+
+assert_checkequal(p .* empty, []);
+assert_checkequal(p .* r, 2+2*s-2*s^2);
+assert_checkequal(p .* c, 1+%i*2+(1+%i*2)*s+(-1-%i*2)*s^2);
+assert_checkequal(p .* R, [1+s-s^2,2+2*s-2*s^2;3+3*s-3*s^2,4+4*s-4*s^2]);
+assert_checkequal(p .* C, [1+%i*2+(1+%i*2)*s+(-1-%i*2)*s^2,2+%i*4+(2+%i*4)*s+(-2-%i*4)*s^2;3+%i*6+(3+%i*6)*s+(-3-%i*6)*s^2,4+%i*8+(4+%i*8)*s+(-4-%i*8)*s^2]);
+assert_checkequal(p .* e, (1+s-s^2)*eye());
+assert_checkequal(p .* ec, (5+%i+(5+%i)*s+(-5-%i)*s^2)*eye());
+assert_checkequal(p .* p, 1+2*s-s^2-2*s^3+s^4);
+assert_checkequal(p .* pc, 1+%i*2+(2-%i)*s+(-1-%i)*s^2+(-2+%i*7)*s^3+(1-%i*4)*s^4);
+assert_checkequal(p .* P, [2+4*s-2*s^2-4*s^3+2*s^4,-3-6*s+3*s^2+6*s^3-3*s^4;4+8*s-4*s^2-8*s^3+4*s^4,-5-10*s+5*s^2+10*s^3-5*s^4]);
+assert_checkequal(p .* PC, [2+%i*4+(4-%i*2)*s+(-2-%i*2)*s^2+(-4+%i*14)*s^3+(2-%i*8)*s^4,-3-%i*6+(-6+%i*3)*s+(3+%i*3)*s^2+(6-%i*21)*s^3+(-3+%i*12)*s^4;4+%i*8+(8-%i*4)*s+(-4-%i*4)*s^2+(-8+%i*28)*s^3+(4-%i*16)*s^4,-5-%i*10+(-10+%i*5)*s+(5+%i*5)*s^2+(10-%i*35)*s^3+(-5+%i*20)*s^4]);
+
+assert_checkequal(pc .* empty, []);
+assert_checkequal(pc .* r, 2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2);
+assert_checkequal(pc .* c, -3+%i*4+(7-%i)*s+(-9+%i*2)*s^2);
+assert_checkequal(pc .* R, [1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2;3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2,4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2]);
+assert_checkequal(pc .* C, [-3+%i*4+(7-%i)*s+(-9+%i*2)*s^2,-6+%i*8+(14-%i*2)*s+(-18+%i*4)*s^2;-9+%i*12+(21-%i*3)*s+(-27+%i*6)*s^2,-12+%i*16+(28-%i*4)*s+(-36+%i*8)*s^2]);
+assert_checkequal(pc .* e, (1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2)*eye());
+assert_checkequal(pc .* ec, (3+%i*11+(8-%i*14)*s+(-9+%i*19)*s^2)*eye());
+assert_checkequal(pc .* p, 1+%i*2+(2-%i)*s+(-1-%i)*s^2+(-2+%i*7)*s^3+(1-%i*4)*s^4);
+assert_checkequal(pc .* pc, -3+%i*4+(14-%i*2)*s+(-26-%i*2)*s^2+(22+%i*14)*s^3+(-15-%i*8)*s^4);
+assert_checkequal(pc .* P, [2+%i*4+(4-%i*2)*s+(-2-%i*2)*s^2+(-4+%i*14)*s^3+(2-%i*8)*s^4,-3-%i*6+(-6+%i*3)*s+(3+%i*3)*s^2+(6-%i*21)*s^3+(-3+%i*12)*s^4;4+%i*8+(8-%i*4)*s+(-4-%i*4)*s^2+(-8+%i*28)*s^3+(4-%i*16)*s^4,-5-%i*10+(-10+%i*5)*s+(5+%i*5)*s^2+(10-%i*35)*s^3+(-5+%i*20)*s^4]);
+assert_checkequal(pc .* PC, [-6+%i*8+(28-%i*4)*s+(-52-%i*4)*s^2+(44+%i*28)*s^3+(-30-%i*16)*s^4,9-%i*12+(-42+%i*6)*s+(78+%i*6)*s^2+(-66-%i*42)*s^3+(45+%i*24)*s^4;-12+%i*16+(56-%i*8)*s+(-104-%i*8)*s^2+(88+%i*56)*s^3+(-60-%i*32)*s^4,15-%i*20+(-70+%i*10)*s+(130+%i*10)*s^2+(-110-%i*70)*s^3+(75+%i*40)*s^4]);
+
+assert_checkequal(P .* empty, []);
+assert_checkequal(P .* r, [4+4*s-4*s^2,-6-6*s+6*s^2;8+8*s-8*s^2,-10-10*s+10*s^2]);
+assert_checkequal(P .* c, [2+%i*4+(2+%i*4)*s+(-2-%i*4)*s^2,-3-%i*6+(-3-%i*6)*s+(3+%i*6)*s^2;4+%i*8+(4+%i*8)*s+(-4-%i*8)*s^2,-5-%i*10+(-5-%i*10)*s+(5+%i*10)*s^2]);
+assert_checkequal(P .* R, [2+2*s-2*s^2,-6-6*s+6*s^2;12+12*s-12*s^2,-20-20*s+20*s^2]);
+assert_checkequal(P .* C, [2+%i*4+(2+%i*4)*s+(-2-%i*4)*s^2,-6-%i*12+(-6-%i*12)*s+(6+%i*12)*s^2;12+%i*24+(12+%i*24)*s+(-12-%i*24)*s^2,-20-%i*40+(-20-%i*40)*s+(20+%i*40)*s^2]);
+assert_checkequal(P .* p, [2+4*s-2*s^2-4*s^3+2*s^4,-3-6*s+3*s^2+6*s^3-3*s^4;4+8*s-4*s^2-8*s^3+4*s^4,-5-10*s+5*s^2+10*s^3-5*s^4]);
+assert_checkequal(P .* pc, [2+%i*4+(4-%i*2)*s+(-2-%i*2)*s^2+(-4+%i*14)*s^3+(2-%i*8)*s^4,-3-%i*6+(-6+%i*3)*s+(3+%i*3)*s^2+(6-%i*21)*s^3+(-3+%i*12)*s^4;4+%i*8+(8-%i*4)*s+(-4-%i*4)*s^2+(-8+%i*28)*s^3+(4-%i*16)*s^4,-5-%i*10+(-10+%i*5)*s+(5+%i*5)*s^2+(10-%i*35)*s^3+(-5+%i*20)*s^4]);
+assert_checkequal(P .* P, [4+8*s-4*s^2-8*s^3+4*s^4,9+18*s-9*s^2-18*s^3+9*s^4;16+32*s-16*s^2-32*s^3+16*s^4,25+50*s-25*s^2-50*s^3+25*s^4]);
+assert_checkequal(P .* PC, [4+%i*8+(8-%i*4)*s+(-4-%i*4)*s^2+(-8+%i*28)*s^3+(4-%i*16)*s^4,9+%i*18+(18-%i*9)*s+(-9-%i*9)*s^2+(-18+%i*63)*s^3+(9-%i*36)*s^4;16+%i*32+(32-%i*16)*s+(-16-%i*16)*s^2+(-32+%i*112)*s^3+(16-%i*64)*s^4,25+%i*50+(50-%i*25)*s+(-25-%i*25)*s^2+(-50+%i*175)*s^3+(25-%i*100)*s^4]);
+
+assert_checkequal(PC .* empty, []);
+assert_checkequal(PC .* r, [4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-6-%i*12+(-6+%i*18)*s+(6-%i*24)*s^2;8+%i*16+(8-%i*24)*s+(-8+%i*32)*s^2,-10-%i*20+(-10+%i*30)*s+(10-%i*40)*s^2]);
+assert_checkequal(PC .* c, [-6+%i*8+(14-%i*2)*s+(-18+%i*4)*s^2,9-%i*12+(-21+%i*3)*s+(27-%i*6)*s^2;-12+%i*16+(28-%i*4)*s+(-36+%i*8)*s^2,15-%i*20+(-35+%i*5)*s+(45-%i*10)*s^2]);
+assert_checkequal(PC .* R, [2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-6-%i*12+(-6+%i*18)*s+(6-%i*24)*s^2;12+%i*24+(12-%i*36)*s+(-12+%i*48)*s^2,-20-%i*40+(-20+%i*60)*s+(20-%i*80)*s^2]);
+assert_checkequal(PC .* C, [-6+%i*8+(14-%i*2)*s+(-18+%i*4)*s^2,18-%i*24+(-42+%i*6)*s+(54-%i*12)*s^2;-36+%i*48+(84-%i*12)*s+(-108+%i*24)*s^2,60-%i*80+(-140+%i*20)*s+(180-%i*40)*s^2]);
+assert_checkequal(PC .* p, [2+%i*4+(4-%i*2)*s+(-2-%i*2)*s^2+(-4+%i*14)*s^3+(2-%i*8)*s^4,-3-%i*6+(-6+%i*3)*s+(3+%i*3)*s^2+(6-%i*21)*s^3+(-3+%i*12)*s^4;4+%i*8+(8-%i*4)*s+(-4-%i*4)*s^2+(-8+%i*28)*s^3+(4-%i*16)*s^4,-5-%i*10+(-10+%i*5)*s+(5+%i*5)*s^2+(10-%i*35)*s^3+(-5+%i*20)*s^4]);
+assert_checkequal(PC .* pc, [-6+%i*8+(28-%i*4)*s+(-52-%i*4)*s^2+(44+%i*28)*s^3+(-30-%i*16)*s^4,9-%i*12+(-42+%i*6)*s+(78+%i*6)*s^2+(-66-%i*42)*s^3+(45+%i*24)*s^4;-12+%i*16+(56-%i*8)*s+(-104-%i*8)*s^2+(88+%i*56)*s^3+(-60-%i*32)*s^4,15-%i*20+(-70+%i*10)*s+(130+%i*10)*s^2+(-110-%i*70)*s^3+(75+%i*40)*s^4]);
+assert_checkequal(PC .* P, [4+%i*8+(8-%i*4)*s+(-4-%i*4)*s^2+(-8+%i*28)*s^3+(4-%i*16)*s^4,9+%i*18+(18-%i*9)*s+(-9-%i*9)*s^2+(-18+%i*63)*s^3+(9-%i*36)*s^4;16+%i*32+(32-%i*16)*s+(-16-%i*16)*s^2+(-32+%i*112)*s^3+(16-%i*64)*s^4,25+%i*50+(50-%i*25)*s+(-25-%i*25)*s^2+(-50+%i*175)*s^3+(25-%i*100)*s^4]);
+assert_checkequal(PC .* PC, [-12+%i*16+(56-%i*8)*s+(-104-%i*8)*s^2+(88+%i*56)*s^3+(-60-%i*32)*s^4,-27+%i*36+(126-%i*18)*s+(-234-%i*18)*s^2+(198+%i*126)*s^3+(-135-%i*72)*s^4;-48+%i*64+(224-%i*32)*s+(-416-%i*32)*s^2+(352+%i*224)*s^3+(-240-%i*128)*s^4,-75+%i*100+(350-%i*50)*s+(-650-%i*50)*s^2+(550+%i*350)*s^3+(-375-%i*200)*s^4]);
+
+assert_checkequal(SP .* empty, []);
+assert_checkequal(SP .* r, sparse([1,2;3,10;4,5],[2;6;4],[4,10]));
+assert_checkequal(SP .* c, sparse([1,2;3,10;4,5],[ 1+%i*2; 3+%i*6; 2+%i*4],[4,10]));
+assert_checkequal(SP .* SP, sparse([1,2;3,10;4,5],[1;9;4],[4,10]));
+assert_checkequal(SP .* SPC, sparse([1,2;3,10;4,5],[ 1+%i*4; 9+%i*36; 4+%i*16],[4,10]));
+
+assert_checkequal(SPC .* empty, []);
+assert_checkequal(SPC .* r, sparse([1,2;3,10;4,5],[ 2+%i*8; 6+%i*24; 4+%i*16],[4,10]));
+assert_checkequal(SPC .* c, sparse([1,2;3,10;4,5],[-7+%i*6;-21+%i*18;-14+%i*12],[4,10]));
+assert_checkequal(SPC .* SP, sparse([1,2;3,10;4,5],[ 1+%i*4; 9+%i*36; 4+%i*16],[4,10]));
+assert_checkequal(SPC .* SPC, sparse([1,2;3,10;4,5],[-15+%i*8;-135+%i*72;-60+%i*32],[4,10]));
+
+assert_checkequal(i8 .* r, int8(-16));
+assert_checkequal(i8 .* R, int8([-8,-16;-24,-32]));
+assert_checkequal(i8 .* i8, int8(64));
+assert_checkequal(i8 .* I8, int8([64,-128;-64,0]));
+assert_checkequal(i8 .* ui8, uint8(192));
+assert_checkequal(i8 .* UI8, uint8([192,128;64,0]));
+assert_checkequal(i8 .* i16, int16(128));
+assert_checkequal(i8 .* I16, int16([128,256;384,512]));
+assert_checkequal(i8 .* ui16, uint16(65408));
+assert_checkequal(i8 .* UI16, uint16([65408,65280;65152,65024]));
+assert_checkequal(i8 .* i32, int32(256));
+assert_checkequal(i8 .* I32, int32([256,512;768,1024]));
+assert_checkequal(i8 .* ui32, uint32(4294967040));
+assert_checkequal(i8 .* UI32, uint32([4294967040,4294966784;4294966528,4294966272]));
+
+assert_checkequal(I8 .* r, int8([-16,-32;-48,-64]));
+assert_checkequal(I8 .* R, int8([-8,-32;-72,-128]));
+assert_checkequal(I8 .* i8, int8([64,-128;-64,0]));
+assert_checkequal(I8 .* I8, int8([64,0;64,0]));
+assert_checkequal(I8 .* ui8, uint8([192,128;64,0]));
+assert_checkequal(I8 .* UI8, uint8([192,0;192,0]));
+assert_checkequal(I8 .* i16, int16([128,256;384,512]));
+assert_checkequal(I8 .* I16, int16([128,512;1152,2048]));
+assert_checkequal(I8 .* ui16, uint16([65408,65280;65152,65024]));
+assert_checkequal(I8 .* UI16, uint16([65408,65024;64384,63488]));
+assert_checkequal(I8 .* i32, int32([256,512;768,1024]));
+assert_checkequal(I8 .* I32, int32([256,1024;2304,4096]));
+assert_checkequal(I8 .* ui32, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(I8 .* UI32, uint32([4294967040,4294966272;4294964992,4294963200]));
+
+assert_checkequal(ui8 .* r, uint8(16));
+assert_checkequal(ui8 .* R, uint8([8,16;24,32]));
+assert_checkequal(ui8 .* i8, uint8(192));
+assert_checkequal(ui8 .* I8, uint8([192,128;64,0]));
+assert_checkequal(ui8 .* ui8, uint8(64));
+assert_checkequal(ui8 .* UI8, uint8([64,128;192,0]));
+assert_checkequal(ui8 .* i16, uint16(65408));
+assert_checkequal(ui8 .* I16, uint16([65408,65280;65152,65024]));
+assert_checkequal(ui8 .* ui16, uint16(128));
+assert_checkequal(ui8 .* UI16, uint16([128,256;384,512]));
+assert_checkequal(ui8 .* i32, uint32(4294967040));
+assert_checkequal(ui8 .* I32, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(ui8 .* ui32, uint32(256));
+assert_checkequal(ui8 .* UI32, uint32([256,512;768,1024]));
+
+assert_checkequal(UI8 .* r, uint8([16,32;48,64]));
+assert_checkequal(UI8 .* R, uint8([8,32;72,128]));
+assert_checkequal(UI8 .* i8, uint8([192,128;64,0]));
+assert_checkequal(UI8 .* I8, uint8([192,0;192,0]));
+assert_checkequal(UI8 .* ui8, uint8([64,128;192,0]));
+assert_checkequal(UI8 .* UI8, uint8([64,0;64,0]));
+assert_checkequal(UI8 .* i16, uint16([65408,65280;65152,65024]));
+assert_checkequal(UI8 .* I16, uint16([65408,65024;64384,63488]));
+assert_checkequal(UI8 .* ui16, uint16([128,256;384,512]));
+assert_checkequal(UI8 .* UI16, uint16([128,512;1152,2048]));
+assert_checkequal(UI8 .* i32, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(UI8 .* I32, uint32([4294967040,4294966272;4294964992,4294963200]));
+assert_checkequal(UI8 .* ui32, uint32([256,512;768,1024]));
+assert_checkequal(UI8 .* UI32, uint32([256,1024;2304,4096]));
+
+assert_checkequal(i16 .* r, int16(-32));
+assert_checkequal(i16 .* R, int16([-16,-32;-48,-64]));
+assert_checkequal(i16 .* i8, int16(128));
+assert_checkequal(i16 .* I8, int16([128,256;384,512]));
+assert_checkequal(i16 .* ui8, uint16(65408));
+assert_checkequal(i16 .* UI8, uint16([65408,65280;65152,65024]));
+assert_checkequal(i16 .* i16, int16(256));
+assert_checkequal(i16 .* I16, int16([256,512;768,1024]));
+assert_checkequal(i16 .* ui16, uint16(65280));
+assert_checkequal(i16 .* UI16, uint16([65280,65024;64768,64512]));
+assert_checkequal(i16 .* i32, int32(512));
+assert_checkequal(i16 .* I32, int32([512,1024;1536,2048]));
+assert_checkequal(i16 .* ui32, uint32(4294966784));
+assert_checkequal(i16 .* UI32, uint32([4294966784,4294966272;4294965760,4294965248]));
+
+assert_checkequal(I16 .* r, int16([-32,-64;-96,-128]));
+assert_checkequal(I16 .* R, int16([-16,-64;-144,-256]));
+assert_checkequal(I16 .* i8, int16([128,256;384,512]));
+assert_checkequal(I16 .* I8, int16([128,512;1152,2048]));
+assert_checkequal(I16 .* ui8, uint16([65408,65280;65152,65024]));
+assert_checkequal(I16 .* UI8, uint16([65408,65024;64384,63488]));
+assert_checkequal(I16 .* i16, int16([256,512;768,1024]));
+assert_checkequal(I16 .* I16, int16([256,1024;2304,4096]));
+assert_checkequal(I16 .* ui16, uint16([65280,65024;64768,64512]));
+assert_checkequal(I16 .* UI16, uint16([65280,64512;63232,61440]));
+assert_checkequal(I16 .* i32, int32([512,1024;1536,2048]));
+assert_checkequal(I16 .* I32, int32([512,2048;4608,8192]));
+assert_checkequal(I16 .* ui32, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(I16 .* UI32, uint32([4294966784,4294965248;4294962688,4294959104]));
+
+assert_checkequal(ui16 .* r, uint16(32));
+assert_checkequal(ui16 .* R, uint16([16,32;48,64]));
+assert_checkequal(ui16 .* i8, uint16(65408));
+assert_checkequal(ui16 .* I8, uint16([65408,65280;65152,65024]));
+assert_checkequal(ui16 .* ui8, uint16(128));
+assert_checkequal(ui16 .* UI8, uint16([128,256;384,512]));
+assert_checkequal(ui16 .* i16, uint16(65280));
+assert_checkequal(ui16 .* I16, uint16([65280,65024;64768,64512]));
+assert_checkequal(ui16 .* ui16, uint16(256));
+assert_checkequal(ui16 .* UI16, uint16([256,512;768,1024]));
+assert_checkequal(ui16 .* i32, uint32(4294966784));
+assert_checkequal(ui16 .* I32, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(ui16 .* ui32, uint32(512));
+assert_checkequal(ui16 .* UI32, uint32([512,1024;1536,2048]));
+
+assert_checkequal(UI16 .* r, uint16([32,64;96,128]));
+assert_checkequal(UI16 .* R, uint16([16,64;144,256]));
+assert_checkequal(UI16 .* i8, uint16([65408,65280;65152,65024]));
+assert_checkequal(UI16 .* I8, uint16([65408,65024;64384,63488]));
+assert_checkequal(UI16 .* ui8, uint16([128,256;384,512]));
+assert_checkequal(UI16 .* UI8, uint16([128,512;1152,2048]));
+assert_checkequal(UI16 .* i16, uint16([65280,65024;64768,64512]));
+assert_checkequal(UI16 .* I16, uint16([65280,64512;63232,61440]));
+assert_checkequal(UI16 .* ui16, uint16([256,512;768,1024]));
+assert_checkequal(UI16 .* UI16, uint16([256,1024;2304,4096]));
+assert_checkequal(UI16 .* i32, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(UI16 .* I32, uint32([4294966784,4294965248;4294962688,4294959104]));
+assert_checkequal(UI16 .* ui32, uint32([512,1024;1536,2048]));
+assert_checkequal(UI16 .* UI32, uint32([512,2048;4608,8192]));
+
+assert_checkequal(i32 .* r, int32(-64));
+assert_checkequal(i32 .* R, int32([-32,-64;-96,-128]));
+assert_checkequal(i32 .* i8, int32(256));
+assert_checkequal(i32 .* I8, int32([256,512;768,1024]));
+assert_checkequal(i32 .* ui8, uint32(4294967040));
+assert_checkequal(i32 .* UI8, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(i32 .* i16, int32(512));
+assert_checkequal(i32 .* I16, int32([512,1024;1536,2048]));
+assert_checkequal(i32 .* ui16, uint32(4294966784));
+assert_checkequal(i32 .* UI16, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(i32 .* i32, int32(1024));
+assert_checkequal(i32 .* I32, int32([1024,2048;3072,4096]));
+assert_checkequal(i32 .* ui32, uint32(4294966272));
+assert_checkequal(i32 .* UI32, uint32([4294966272,4294965248;4294964224,4294963200]));
+
+assert_checkequal(I32 .* r, int32([-64,-128;-192,-256]));
+assert_checkequal(I32 .* R, int32([-32,-128;-288,-512]));
+assert_checkequal(I32 .* i8, int32([256,512;768,1024]));
+assert_checkequal(I32 .* I8, int32([256,1024;2304,4096]));
+assert_checkequal(I32 .* ui8, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(I32 .* UI8, uint32([4294967040,4294966272;4294964992,4294963200]));
+assert_checkequal(I32 .* i16, int32([512,1024;1536,2048]));
+assert_checkequal(I32 .* I16, int32([512,2048;4608,8192]));
+assert_checkequal(I32 .* ui16, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(I32 .* UI16, uint32([4294966784,4294965248;4294962688,4294959104]));
+assert_checkequal(I32 .* i32, int32([1024,2048;3072,4096]));
+assert_checkequal(I32 .* I32, int32([1024,4096;9216,16384]));
+assert_checkequal(I32 .* ui32, uint32([4294966272,4294965248;4294964224,4294963200]));
+assert_checkequal(I32 .* UI32, uint32([4294966272,4294963200;4294958080,4294950912]));
+
+assert_checkequal(ui32 .* r, uint32(64));
+assert_checkequal(ui32 .* R, uint32([32,64;96,128]));
+assert_checkequal(ui32 .* i8, uint32(4294967040));
+assert_checkequal(ui32 .* I8, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(ui32 .* ui8, uint32(256));
+assert_checkequal(ui32 .* UI8, uint32([256,512;768,1024]));
+assert_checkequal(ui32 .* i16, uint32(4294966784));
+assert_checkequal(ui32 .* I16, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(ui32 .* ui16, uint32(512));
+assert_checkequal(ui32 .* UI16, uint32([512,1024;1536,2048]));
+assert_checkequal(ui32 .* i32, uint32(4294966272));
+assert_checkequal(ui32 .* I32, uint32([4294966272,4294965248;4294964224,4294963200]));
+assert_checkequal(ui32 .* ui32, uint32(1024));
+assert_checkequal(ui32 .* UI32, uint32([1024,2048;3072,4096]));
+
+assert_checkequal(UI32 .* r, uint32([64,128;192,256]));
+assert_checkequal(UI32 .* R, uint32([32,128;288,512]));
+assert_checkequal(UI32 .* i8, uint32([4294967040,4294966784;4294966528,4294966272]));
+assert_checkequal(UI32 .* I8, uint32([4294967040,4294966272;4294964992,4294963200]));
+assert_checkequal(UI32 .* ui8, uint32([256,512;768,1024]));
+assert_checkequal(UI32 .* UI8, uint32([256,1024;2304,4096]));
+assert_checkequal(UI32 .* i16, uint32([4294966784,4294966272;4294965760,4294965248]));
+assert_checkequal(UI32 .* I16, uint32([4294966784,4294965248;4294962688,4294959104]));
+assert_checkequal(UI32 .* ui16, uint32([512,1024;1536,2048]));
+assert_checkequal(UI32 .* UI16, uint32([512,2048;4608,8192]));
+assert_checkequal(UI32 .* i32, uint32([4294966272,4294965248;4294964224,4294963200]));
+assert_checkequal(UI32 .* I32, uint32([4294966272,4294963200;4294958080,4294950912]));
+assert_checkequal(UI32 .* ui32, uint32([1024,2048;3072,4096]));
+assert_checkequal(UI32 .* UI32, uint32([1024,4096;9216,16384]));
index 650687f..0a75330 100644 (file)
@@ -5,6 +5,8 @@
 //  This file is distributed under the same license as the Scilab package.
 // ============================================================================
 // <-- JVM NOT MANDATORY -->
+s = %s;
+empty = [];
 r = 2;
 R = [1,2;3,4];
 R3(:,:,1) = R;
@@ -22,218 +24,378 @@ PC = [2*pc, -3*pc;4*pc,-5*pc];
 SP = sparse([1,2;4,5;3,10],[1,2,3]);
 SPC = sparse([1,2;4,5;3,10],[1,2,3]) * ( 1 + 4*%i);
 i8 = int8(-8);
-i16 = int16(-16);
-i32 = int32(-32);
-i64 = int64(-64);
 ui8 = uint8(8);
-ui16 = uint16(16);
-ui32 = uint32(32);
-ui64 = uint64(64);
 I8 = int8([-8 -16 ; -24 -32]);
-I16 = int16([-16 -32 ; -48 -64]);
-I32 = int32([-32 -64 ; -96 -128]);
-I64 = int64([-64 -128 ; -192 -256]);
 UI8 = uint8([8 16 ; 24 32]);
+I16 = int16([-16 -32 ; -48 -64]);
 UI16 = uint16([16 32 ; 48 64]);
+i16 = int16(-16);
+ui16 = uint16(16);
+i32 = int32(-32);
+ui32 = uint32(32);
+I32 = int32([-32 -64 ; -96 -128]);
 UI32 = uint32([32 64 ; 96 128]);
-UI64 = uint64([64 128 ; 192 256]);
-//Empty
-assert_checkequal([] - [], []);
-assert_checkequal([] - r, -r);
-assert_checkequal([] - R, -R);
-assert_checkequal([] - R3, -R3);
-assert_checkequal([] - c, -c);
-assert_checkequal([] - C, -C);
-assert_checkequal([] - C3, -C3);
-assert_checkequal([] - e, -e);
-assert_checkequal([] - ec, -ec);
-assert_checkequal([] - p, -p);
-assert_checkequal([] - pc, -pc);
-assert_checkequal([] - P, -P);
-assert_checkequal([] - PC, -PC);
-assert_checkequal([] - SP, -SP);
-assert_checkequal([] - SPC, -SPC);
-assert_checkequal([] - i8, -i8);
-assert_checkequal([] - I8, -I8);
-assert_checkequal([] - ui8, -ui8);
-assert_checkequal([] - UI8, -UI8);
-assert_checkequal([] - ui16, -ui16);
-assert_checkequal([] - UI16, -UI16);
-assert_checkequal([] - ui16, -ui16);
-assert_checkequal([] - UI16, -UI16);
-assert_checkequal([] - ui32, -ui32);
-assert_checkequal([] - UI32, -UI32);
-assert_checkequal([] - ui32, -ui32);
-assert_checkequal([] - UI32, -UI32);
-assert_checkequal([] - ui64, -ui64);
-assert_checkequal([] - UI64, -UI64);
-assert_checkequal([] - ui64, -ui64);
-assert_checkequal([] - UI64, -UI64);
-//Identity
-assert_checkequal(e - [], e);
-assert_checkequal(ec - [], ec);
-assert_checkequal(e - r, -1);
-assert_checkequal(ec - r, 3+%i);
-assert_checkequal(e - R, [0 -2;-3 -3]);
-assert_checkequal(ec - R, [4+%i -2;-3 1+%i]);
-assert_checkequal(e - c, -2*%i);
-assert_checkequal(ec - c, 4 - %i);
-assert_checkequal(e - C, [-2*%i -2-4*%i;-3-6*%i -3-8*%i]);
-assert_checkequal(ec - C, [4-%i -2-4*%i;-3-6*%i 1-7*%i]);
-assert_checkequal(e - e, eye() * 0);
-assert_checkequal(ec - e, eye() * (4+%i));
-assert_checkequal(e - ec, eye() * (-4-%i));
-assert_checkequal(ec - ec, eye() * 0 * %i);
-assert_checkequal(e - p, -%s+%s**2);
-assert_checkequal(ec - p, 4-%s+%s**2 + %i);
-assert_checkequal(e - pc, -%s+%s**2 + (-2+3*%s-4*%s**2)*%i);
-assert_checkequal(ec - pc, 4-%s+%s**2 + (-1+3*%s-4*%s**2)*%i);
-assert_checkequal(e - P, [-1-2*%s+2*%s**2 3+3*%s-3*%s**2;-4-4*%s+4*%s**2 6+5*%s-5*%s**2]);
-assert_checkequal(ec - P, [3+%i-2*%s+2*%s^2,3+3*%s-3*%s^2;-4-4*%s+4*%s^2,10+%i+5*%s-5*%s^2]);
-assert_checkequal(e - PC, [-1-%i*4+(-2+%i*6)*%s+(2-%i*8)*%s^2,3+%i*6+(3-%i*9)*%s+(-3+%i*12)*%s^2;-4-%i*8+(-4+%i*12)*%s+(4-%i*16)*%s^2,6+%i*10+(5-%i*15)*%s+(-5+%i*20)*%s^2]);
-assert_checkequal(ec - PC, [3-%i*3+(-2+%i*6)*%s+(2-%i*8)*%s^2,3+%i*6+(3-%i*9)*%s+(-3+%i*12)*%s^2;-4-%i*8+(-4+%i*12)*%s+(4-%i*16)*%s^2,10+%i*11+(5-%i*15)*%s+(-5+%i*20)*%s^2]);
-assert_checkequal(e - SP, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[1;-1;1;1;-3;1;-2],[4,10]));
-assert_checkequal(ec - SP, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i;-1; 5+%i; 5+%i;-3; 5+%i;-2],[4,10]));
-assert_checkequal(e - SPC, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 1;-1-%i*4; 1; 1;-3-%i*12; 1;-2-%i*8],[4,10]));
-assert_checkequal(ec - SPC, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i;-1-%i*4; 5+%i; 5+%i;-3-%i*12; 5+%i;-2-%i*8],[4,10]));
-assert_checkequal(e - i8, int8(9));
-assert_checkequal(e - I8, int8([9 16;24 33]));
-assert_checkequal(e - ui8, uint8(249));
-assert_checkequal(e - UI8, uint8([249 240;232 225]));
-assert_checkequal(e - i16, int16(17));
-assert_checkequal(e - I16, int16([17,32;48,65]));
-assert_checkequal(e - ui16, uint16(65521));
-assert_checkequal(e - UI16, uint16([65521,65504;65488,65473]));
-assert_checkequal(e - i32, int32(33));
-assert_checkequal(e - I32, int32([33,64;96,129]));
-assert_checkequal(e - ui32, uint32(4294967265));
-assert_checkequal(e - UI32, uint32([4294967265,4294967232;4294967200,4294967169]));
-assert_checkequal(e - i64, int64(65));
-assert_checkequal(e - I64, int64([65,128;192,257]));
-// double
-assert_checkequal(r - [], r);
+assert_checkequal(empty - empty, []);
+assert_checkequal(empty - r, -2);
+assert_checkequal(empty - c, -1-%i*2);
+assert_checkequal(empty - R, [-1,-2;-3,-4]);
+assert_checkequal(empty - C, [-1-%i*2,-2-%i*4;-3-%i*6,-4-%i*8]);
+assert_checkequal(empty - e, (-1)*eye());
+assert_checkequal(empty - ec, (-5-%i)*eye());
+assert_checkequal(empty - p, -1-s+s^2);
+assert_checkequal(empty - pc, -1-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2);
+assert_checkequal(empty - P, [-2-2*s+2*s^2,3+3*s-3*s^2;-4-4*s+4*s^2,5+5*s-5*s^2]);
+assert_checkequal(empty - PC, [-2-%i*4+(-2+%i*6)*s+(2-%i*8)*s^2,3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2;-4-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2,5+%i*10+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(empty - SP, sparse([1,2;3,10;4,5],[-1;-3;-2],[4,10]));
+assert_checkequal(empty - SPC, sparse([1,2;3,10;4,5],[-1-%i*4;-3-%i*12;-2-%i*8],[4,10]));
+assert_checkequal(empty - i8, int8(8));
+assert_checkequal(empty - I8, int8([8,16;24,32]));
+assert_checkequal(empty - ui8, uint8(248));
+assert_checkequal(empty - UI8, uint8([248,240;232,224]));
+assert_checkequal(empty - i16, int16(16));
+assert_checkequal(empty - I16, int16([16,32;48,64]));
+assert_checkequal(empty - ui16, uint16(65520));
+assert_checkequal(empty - UI16, uint16([65520,65504;65488,65472]));
+assert_checkequal(empty - i32, int32(32));
+assert_checkequal(empty - I32, int32([32,64;96,128]));
+assert_checkequal(empty - ui32, uint32(4294967264));
+assert_checkequal(empty - UI32, uint32([4294967264,4294967232;4294967200,4294967168]));
+assert_checkequal(r - empty, 2);
+assert_checkequal(r - r, 0);
+assert_checkequal(r - c,  1-%i*2);
+assert_checkequal(r - R, [1,0;-1,-2]);
+assert_checkequal(r - C, [ 1-%i*2,-%i*4;-1-%i*6,-2-%i*8]);
 assert_checkequal(r - e, 1);
 assert_checkequal(r - ec, -3-%i);
-assert_checkequal(c - [], c);
-assert_checkequal(c - e, 2*%i);
-assert_checkequal(c - ec, -4+%i);
-assert_checkequal(R - [], R);
-assert_checkequal(R - e, [0 2; 3 3]);
-assert_checkequal(R - ec, [-4-%i, 2; 3,-1-%i]);
-assert_checkequal(C - [], C);
-assert_checkequal(C - e, [%i*2, 2+%i*4; 3+%i*6, 3+%i*8]);
-assert_checkequal(C - ec, [-4+%i, 2+%i*4; 3+%i*6,-1+%i*7]);
-assert_checkequal(r - r, 0);
-assert_checkequal(r - c, 1-%i*2);
+assert_checkequal(r - p, 1-s+s^2);
+assert_checkequal(r - pc, 1-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2);
+assert_checkequal(r - P, [-2*s+2*s^2,5+3*s-3*s^2;-2-4*s+4*s^2,7+5*s-5*s^2]);
+assert_checkequal(r - PC, [-%i*4+(-2+%i*6)*s+(2-%i*8)*s^2,5+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2;-2-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2,7+%i*10+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(r - SP, [2,1,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,-1;2,2,2,2,0,2,2,2,2,2]);
+assert_checkequal(r - SPC, [ 2, 1-%i*4, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2,-1-%i*12; 2, 2, 2, 2,-%i*8, 2, 2, 2, 2, 2]);
+assert_checkequal(r - i8, int8(10));
+assert_checkequal(r - I8, int8([10,18;26,34]));
+assert_checkequal(r - ui8, uint8(250));
+assert_checkequal(r - UI8, uint8([250,242;234,226]));
+assert_checkequal(r - i16, int16(18));
+assert_checkequal(r - I16, int16([18,34;50,66]));
+assert_checkequal(r - ui16, uint16(65522));
+assert_checkequal(r - UI16, uint16([65522,65506;65490,65474]));
+assert_checkequal(r - i32, int32(34));
+assert_checkequal(r - I32, int32([34,66;98,130]));
+assert_checkequal(r - ui32, uint32(4294967266));
+assert_checkequal(r - UI32, uint32([4294967266,4294967234;4294967202,4294967170]));
+assert_checkequal(c - empty,  1+%i*2);
 assert_checkequal(c - r, -1+%i*2);
 assert_checkequal(c - c, 0*%i);
-assert_checkequal(r - R, [1,0;-1,-2]);
-rR3ref(:,:,1) = [1,0;-1,-2];
-rR3ref(:,:,2) = [1,-1;0,-2] ;
-assert_checkequal(r - R3, rR3ref);
-assert_checkequal(r - C, [ 1-%i*2,-%i*4;-1-%i*6,-2-%i*8]);
-rC3ref(:,:,1) = [ 1-%i*2,-%i*4;-1-%i*6,-2-%i*8];
-rC3ref(:,:,2) = [ 1+%i*2,-1+%i*6;%i*4,-2+%i*8];
-assert_checkequal(r - C3, rC3ref);
 assert_checkequal(c - R, [%i*2,-1+%i*2;-2+%i*2,-3+%i*2]);
-cR3ref(:,:,1) = [%i*2,-1+%i*2;-2+%i*2,-3+%i*2];
-cR3ref(:,:,2) = [%i*2,-2+%i*2;-1+%i*2,-3+%i*2];
-assert_checkequal(c - R3, cR3ref);
 assert_checkequal(c - C, [0,-1-%i*2;-2-%i*4,-3-%i*6]);
-cC3ref(:,:,1) = [0,-1-%i*2;-2-%i*4,-3-%i*6];
-cC3ref(:,:,2) = [%i*4,-2+%i*8;-1+%i*6,-3+%i*10];
-assert_checkequal(c - C3, cC3ref);
+assert_checkequal(c - e, %i*2);
+assert_checkequal(c - ec, -4+%i);
+assert_checkequal(c - p, %i*2-s+s^2);
+assert_checkequal(c - pc, (-1+%i*3)*s+(1-%i*4)*s^2);
+assert_checkequal(c - P, [-1+%i*2-2*s+2*s^2,4+%i*2+3*s-3*s^2;-3+%i*2-4*s+4*s^2,6+%i*2+5*s-5*s^2]);
+assert_checkequal(c - PC, [-1-%i*2+(-2+%i*6)*s+(2-%i*8)*s^2,4+%i*8+(3-%i*9)*s+(-3+%i*12)*s^2;-3-%i*6+(-4+%i*12)*s+(4-%i*16)*s^2,6+%i*12+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(c - SP, [ 1+%i*2,%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-2+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
+assert_checkequal(c - SPC, [ 1+%i*2,-%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-2-%i*10; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-1-%i*6, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
+assert_checkequal(R - empty, [1,2;3,4]);
 assert_checkequal(R - r, [-1,0;1,2]);
-R3rref(:,:,1) = [-1,0;1,2];
-R3rref(:,:,2) = [-1,1;0,2];
-assert_checkequal(R3 - r, R3rref);
 assert_checkequal(R - c, [-%i*2, 1-%i*2; 2-%i*2, 3-%i*2]);
-R3cref(:,:,1) = [-%i*2, 1-%i*2; 2-%i*2, 3-%i*2];
-R3cref(:,:,2) = [-%i*2, 2-%i*2; 1-%i*2, 3-%i*2];
-assert_checkequal(R3 - c, R3cref);
-assert_checkequal(C - r, [-1+%i*2,%i*4; 1+%i*6, 2+%i*8]);
-C3rref(:,:,1) = [-1+%i*2,%i*4; 1+%i*6, 2+%i*8];
-C3rref(:,:,2) = [-1-%i*2, 1-%i*6;-%i*4, 2-%i*8];
-assert_checkequal(C3 - r, C3rref);
-assert_checkequal(C - c, [0, 1+%i*2; 2+%i*4, 3+%i*6]);
-C3cref(:,:,1) = [0, 1+%i*2; 2+%i*4, 3+%i*6];
-C3cref(:,:,2) = [-%i*4, 2-%i*8; 1-%i*6, 3-%i*10];
-assert_checkequal(C3 - c, C3cref);
 assert_checkequal(R - R, [0,0;0,0]);
-R3R3ref(:,:,1) = [0,0;0,0];
-R3R3ref(:,:,2) = [0,0;0,0];
-assert_checkequal(R3 - R3, R3R3ref);
 assert_checkequal(R - C, [-%i*2,-%i*4;-%i*6,-%i*8]);
-R3C3ref(:,:,1) = [-%i*2,-%i*4;-%i*6,-%i*8];
-R3C3ref(:,:,2) = [%i*2,%i*6;%i*4,%i*8];
-assert_checkequal(R3 - C3, R3C3ref);
+assert_checkequal(R - e, [0,2;3,3]);
+assert_checkequal(R - ec, [-4-%i, 2; 3,-1-%i]);
+assert_checkequal(R - p, [-s+s^2,1-s+s^2;2-s+s^2,3-s+s^2]);
+assert_checkequal(R - pc, [-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2,1-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2;2-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2,3-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2]);
+assert_checkequal(R - P, [-1-2*s+2*s^2,5+3*s-3*s^2;-1-4*s+4*s^2,9+5*s-5*s^2]);
+assert_checkequal(R - PC, [-1-%i*4+(-2+%i*6)*s+(2-%i*8)*s^2,5+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2;-1-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2,9+%i*10+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(R - i8, int8([9,10;11,12]));
+assert_checkequal(R - I8, int8([9,18;27,36]));
+assert_checkequal(R - ui8, uint8([249,250;251,252]));
+assert_checkequal(R - UI8, uint8([249,242;235,228]));
+assert_checkequal(R - i16, int16([17,18;19,20]));
+assert_checkequal(R - I16, int16([17,34;51,68]));
+assert_checkequal(R - ui16, uint16([65521,65522;65523,65524]));
+assert_checkequal(R - UI16, uint16([65521,65506;65491,65476]));
+assert_checkequal(R - i32, int32([33,34;35,36]));
+assert_checkequal(R - I32, int32([33,66;99,132]));
+assert_checkequal(R - ui32, uint32([4294967265,4294967266;4294967267,4294967268]));
+assert_checkequal(R - UI32, uint32([4294967265,4294967234;4294967203,4294967172]));
+assert_checkequal(C - empty, [ 1+%i*2, 2+%i*4; 3+%i*6, 4+%i*8]);
+assert_checkequal(C - r, [-1+%i*2,%i*4; 1+%i*6, 2+%i*8]);
+assert_checkequal(C - c, [0, 1+%i*2; 2+%i*4, 3+%i*6]);
 assert_checkequal(C - R, [%i*2,%i*4;%i*6,%i*8]);
-C3R3ref(:,:,1) = [%i*2,%i*4;%i*6,%i*8];
-C3R3ref(:,:,2) = [-%i*2,-%i*6;-%i*4,-%i*8];
-assert_checkequal(C3 - R3, C3R3ref);
-assert_checkequal(C - C, [0,0;0,0]*%i);
-C3C3ref(:,:,1) = [0,0;0,0];
-C3C3ref(:,:,2) = [0,0;0,0];
-assert_checkequal(C3 - C3, C3C3ref*%i);
-assert_checkequal(r - SP, [2,1,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,-1;2,2,2,2,0,2,2,2,2,2] );
-assert_checkequal(r - SPC, [ 2, 1-%i*4, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2,-1-%i*12; 2, 2, 2, 2,-%i*8, 2, 2, 2, 2, 2]);
-assert_checkequal(c - SP, [ 1+%i*2,%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+ %i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-2+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
-assert_checkequal(c - SPC, [ 1+%i*2,-%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2;1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-2-%i*10; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-1-%i*6, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
-// polynom
-assert_checkequal(p - [], p);
-assert_checkequal(p - e, %s - %s**2);
-assert_checkequal(p - ec, -4-%i+%s-%s**2);
-assert_checkequal(p - r, -1+%s-%s**2);
-assert_checkequal(p - c, -%i*2+%s-%s**2);
-assert_checkequal(p - R, [%s-%s**2,-1+%s-%s**2;-2+%s-%s**2,-3+%s-%s**2]);
-assert_checkequal(p - C, [-%i*2+%s-%s**2,-1-%i*4+%s-%s**2;-2-%i*6+%s-%s**2,-3-%i*8+%s-%s**2]);
-assert_checkequal(pc - [], pc);
-assert_checkequal(pc - e, %i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2);
-assert_checkequal(pc - ec, -4+%i+(1-%i*3)*%s+(-1+%i*4)*%s**2);
-assert_checkequal(pc - r, -1+%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2);
-assert_checkequal(pc - c, (1-%i*3)*%s+(-1+%i*4)*%s**2);
-assert_checkequal(pc - R, [%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2,-1+%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2;-2+%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2,-3+%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2]);
-assert_checkequal(pc - C, [(1-%i*3)*%s+(-1+%i*4)*%s**2,-1-%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2;-2-%i*4+(1-%i*3)*%s+(-1+%i*4)*%s**2,-3-%i*6+(1-%i*3)*%s+(-1+%i*4)*%s**2]);
-assert_checkequal(P - [], P);
-assert_checkequal(P - e, [1+2*%s-2*%s**2,-3-3*%s+3*%s**2;4+4*%s-4*%s**2,-6-5*%s+5*%s**2] );
-assert_checkequal(P - ec, [-3-%i+2*%s-2*%s**2,-3-3*%s+3*%s**2;4+4*%s-4*%s**2,-10-%i-5*%s+5*%s**2]);
-assert_checkequal(P - r, [2*%s-2*%s**2,-5-3*%s+3*%s**2;2+4*%s-4*%s**2,-7-5*%s+5*%s**2]);
-assert_checkequal(P - c, [1-%i*2+2*%s-2*%s**2,-4-%i*2-3*%s+3*%s**2;3-%i*2+4*%s-4*%s**2,-6-%i*2-5*%s+5*%s**2]);
-assert_checkequal(P - R, [1+2*%s-2*%s**2,-5-3*%s+3*%s**2;1+4*%s-4*%s**2,-9-5*%s+5*%s**2] );
-assert_checkequal(P - C, [1-%i*2+2*%s-2*%s**2,-5-%i*4-3*%s+3*%s**2;1-%i*6+4*%s-4*%s**2,-9-%i*8-5*%s+5*%s**2]);
-assert_checkequal(PC - [], PC);
-assert_checkequal(PC - e, [1+%i*4+(2-%i*6)*%s+(-2+%i*8)*%s**2,-3-%i*6+(-3+%i*9)*%s+(3-%i*12)*%s**2;4+%i*8+(4-%i*12)*%s+(-4+%i*16)*%s**2,-6-%i*10+(-5+%i*15)*%s+(5-%i*20)*%s**2]);
-assert_checkequal(PC - ec, [-3+%i*3+(2-%i*6)*%s+(-2+%i*8)*%s**2,-3-%i*6+(-3+%i*9)*%s+(3-%i*12)*%s**2;4+%i*8+(4-%i*12)*%s+(-4+%i*16)*%s**2,-10-%i*11+(-5+%i*15)*%s+(5-%i*20)*%s**2]);
-assert_checkequal(PC - r, [%i*4+(2-%i*6)*%s+(-2+%i*8)*%s**2,-5-%i*6+(-3+%i*9)*%s+(3-%i*12)*%s**2;2+%i*8+(4-%i*12)*%s+(-4+%i*16)*%s**2,-7-%i*10+(-5+%i*15)*%s+(5-%i*20)*%s**2]);
-assert_checkequal(PC - c, [1+%i*2+(2-%i*6)*%s+(-2+%i*8)*%s**2,-4-%i*8+(-3+%i*9)*%s+(3-%i*12)*%s**2;3+%i*6+(4-%i*12)*%s+(-4+%i*16)*%s**2,-6-%i*12+(-5+%i*15)*%s+(5-%i*20)*%s**2]);
-assert_checkequal(PC - R, [1+%i*4+(2-%i*6)*%s+(-2+%i*8)*%s**2,-5-%i*6+(-3+%i*9)*%s+(3-%i*12)*%s**2;1+%i*8+(4-%i*12)*%s+(-4+%i*16)*%s**2,-9-%i*10+(-5+%i*15)*%s+(5-%i*20)*%s**2]);
-assert_checkequal(PC - C, [1+%i*2+(2-%i*6)*%s+(-2+%i*8)*%s**2,-5-%i*10+(-3+%i*9)*%s+(3-%i*12)*%s**2;1+%i*2+(4-%i*12)*%s+(-4+%i*16)*%s**2,-9-%i*18+(-5+%i*15)*%s+(5-%i*20)*%s**2]);
-assert_checkequal(p - p, 0*%s);
-assert_checkequal(p - pc, -%i*2+(%i*3)*%s+(-%i*4)*%s**2);
-assert_checkequal(p - P, [-1-%s+%s**2,4+4*%s-4*%s**2;-3-3*%s+3*%s**2,6+6*%s-6*%s**2]);
-assert_checkequal(p - PC, [-1-%i*4+(-1+%i*6)*%s+(1-%i*8)*%s**2,4+%i*6+(4-%i*9)*%s+(-4+%i*12)*%s**2;-3-%i*8+(-3+%i*12)*%s+(3-%i*16)*%s**2,6+%i*10+(6-%i*15)*%s+(-6+%i*20)*%s**2]);
-assert_checkequal(P - p, [1+%s-%s**2,-4-4*%s+4*%s**2;3+3*%s-3*%s**2,-6-6*%s+6*%s**2]);
-assert_checkequal(P - pc, [1-%i*2+(1+%i*3)*%s+(-1-%i*4)*%s**2,-4-%i*2+(-4+%i*3)*%s+(4-%i*4)*%s**2;3-%i*2+(3+%i*3)*%s+(-3-%i*4)*%s**2,-6-%i*2+(-6+%i*3)*%s+(6-%i*4)*%s**2]);
-assert_checkequal(P - P, [0*%s,0*%s;0*%s,0*%s]);
-assert_checkequal(P - PC, [-%i*4+(%i*6)*%s+(-%i*8)*%s**2,%i*6+(-%i*9)*%s+(%i*12)*%s**2;-%i*8+(%i*12)*%s+(-%i*16)*%s**2,%i*10+(-%i*15)*%s+(%i*20)*%s**2]);
-assert_checkequal(pc - p, %i*2+(-%i*3)*%s+(%i*4)*%s**2);
-assert_checkequal(pc - pc, 0*%s);
-assert_checkequal(pc - P, [-1+%i*2+(-1-%i*3)*%s+(1+%i*4)*%s**2,4+%i*2+(4-%i*3)*%s+(-4+%i*4)*%s**2;-3+%i*2+(-3-%i*3)*%s+(3+%i*4)*%s**2,6+%i*2+(6-%i*3)*%s+(-6+%i*4)*%s**2]);
-assert_checkequal(pc - PC, [-1-%i*2+(-1+%i*3)*%s+(1-%i*4)*%s**2,4+%i*8+(4-%i*12)*%s+(-4+%i*16)*%s**2;-3-%i*6+(-3+%i*9)*%s+(3-%i*12)*%s**2,6+%i*12+(6-%i*18)*%s+(-6+%i*24)*%s**2]);
-assert_checkequal(PC - p, [1+%i*4+(1-%i*6)*%s+(-1+%i*8)*%s**2,-4-%i*6+(-4+%i*9)*%s+(4-%i*12)*%s**2;3+%i*8+(3-%i*12)*%s+(-3+%i*16)*%s**2,-6-%i*10+(-6+%i*15)*%s+(6-%i*20)*%s**2]);
-assert_checkequal(PC - pc, [1+%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2,-4-%i*8+(-4+%i*12)*%s+(4-%i*16)*%s**2;3+%i*6+(3-%i*9)*%s+(-3+%i*12)*%s**2,-6-%i*12+(-6+%i*18)*%s+(6-%i*24)*%s**2]);
-assert_checkequal(PC - P, [%i*4+(-%i*6)*%s+(%i*8)*%s**2,-%i*6+(%i*9)*%s+(-%i*12)*%s**2;%i*8+(-%i*12)*%s+(%i*16)*%s**2,-%i*10+(%i*15)*%s+(-%i*20)*%s**2]);
-assert_checkequal(PC - PC, [0*%s,0*%s;0*%s,0*%s]);
-assert_checkequal(SP - [], SP);
-assert_checkequal(SPC - [], SPC);
-assert_checkequal(SP - e, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-1;1;-1;-1;3;-1;2],[4,10]));
-assert_checkequal(SP - ec, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-5-%i; 1;-5-%i;-5-%i; 3;-5-%i; 2],[4,10]));
-assert_checkequal(SPC - e, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-1; 1+%i*4;-1;-1; 3+%i*12;-1; 2+%i*8],[4,10]));
-assert_checkequal(SPC - ec, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-5-%i; 1+%i*4;-5-%i;-5-%i; 3+%i*12;-5-%i; 2+%i*8],[4,10]));
+assert_checkequal(C - C, [0,0;0,0] * %i);
+assert_checkequal(C - e, [%i*2, 2+%i*4; 3+%i*6, 3+%i*8]);
+assert_checkequal(C - ec, [-4+%i, 2+%i*4; 3+%i*6,-1+%i*7]);
+assert_checkequal(C - p, [%i*2-s+s^2,1+%i*4-s+s^2;2+%i*6-s+s^2,3+%i*8-s+s^2]);
+assert_checkequal(C - pc, [(-1+%i*3)*s+(1-%i*4)*s^2,1+%i*2+(-1+%i*3)*s+(1-%i*4)*s^2;2+%i*4+(-1+%i*3)*s+(1-%i*4)*s^2,3+%i*6+(-1+%i*3)*s+(1-%i*4)*s^2]);
+assert_checkequal(C - P, [-1+%i*2-2*s+2*s^2,5+%i*4+3*s-3*s^2;-1+%i*6-4*s+4*s^2,9+%i*8+5*s-5*s^2]);
+assert_checkequal(C - PC, [-1-%i*2+(-2+%i*6)*s+(2-%i*8)*s^2,5+%i*10+(3-%i*9)*s+(-3+%i*12)*s^2;-1-%i*2+(-4+%i*12)*s+(4-%i*16)*s^2,9+%i*18+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(e - empty, eye());
+assert_checkequal(e - r, -1);
+assert_checkequal(e - c, -%i*2);
+assert_checkequal(e - R, [0,-2;-3,-3]);
+assert_checkequal(e - C, [-%i*2,-2-%i*4;-3-%i*6,-3-%i*8]);
+assert_checkequal(e - e, (0)*eye());
+assert_checkequal(e - ec, (-4-%i)*eye());
+assert_checkequal(e - p, -s+s^2);
+assert_checkequal(e - pc, -%i*2+(-1+%i*3)*s+(1-%i*4)*s^2);
+assert_checkequal(e - P, [-1-2*s+2*s^2,3+3*s-3*s^2;-4-4*s+4*s^2,6+5*s-5*s^2]);
+assert_checkequal(e - PC, [-1-%i*4+(-2+%i*6)*s+(2-%i*8)*s^2,3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2;-4-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2,6+%i*10+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(e - SP, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[1;-1;1;1;-3;1;-2],[4,10]));
+assert_checkequal(e - SPC, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 1;-1-%i*4; 1; 1;-3-%i*12; 1;-2-%i*8],[4,10]));
+assert_checkequal(ec - empty, ( 5+%i)*eye());
+assert_checkequal(ec - r,  3+%i);
+assert_checkequal(ec - c,  4-%i);
+assert_checkequal(ec - R, [ 4+%i,-2;-3, 1+%i]);
+assert_checkequal(ec - C, [ 4-%i,-2-%i*4;-3-%i*6, 1-%i*7]);
+assert_checkequal(ec - e, ( 4+%i)*eye());
+assert_checkequal(ec - ec, (0*%i)*eye());
+assert_checkequal(ec - p, 4+%i-s+s^2);
+assert_checkequal(ec - pc, 4-%i+(-1+%i*3)*s+(1-%i*4)*s^2);
+assert_checkequal(ec - P, [3+%i-2*s+2*s^2,3+3*s-3*s^2;-4-4*s+4*s^2,10+%i+5*s-5*s^2]);
+assert_checkequal(ec - PC, [3-%i*3+(-2+%i*6)*s+(2-%i*8)*s^2,3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2;-4-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2,10+%i*11+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(ec - SP, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i;-1; 5+%i; 5+%i;-3; 5+%i;-2],[4,10]));
+assert_checkequal(ec - SPC, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i;-1-%i*4; 5+%i; 5+%i;-3-%i*12; 5+%i;-2-%i*8],[4,10]));
+assert_checkequal(p - empty, 1+s-s^2);
+assert_checkequal(p - r, -1+s-s^2);
+assert_checkequal(p - c, -%i*2+s-s^2);
+assert_checkequal(p - R, [s-s^2,-1+s-s^2;-2+s-s^2,-3+s-s^2]);
+assert_checkequal(p - C, [-%i*2+s-s^2,-1-%i*4+s-s^2;-2-%i*6+s-s^2,-3-%i*8+s-s^2]);
+assert_checkequal(p - e, s-s^2);
+assert_checkequal(p - ec, -4-%i+s-s^2);
+assert_checkequal(p - p, 0*s);
+assert_checkequal(p - pc, -%i*2+(%i*3)*s+(-%i*4)*s^2);
+assert_checkequal(p - P, [-1-s+s^2,4+4*s-4*s^2;-3-3*s+3*s^2,6+6*s-6*s^2]);
+assert_checkequal(p - PC, [-1-%i*4+(-1+%i*6)*s+(1-%i*8)*s^2,4+%i*6+(4-%i*9)*s+(-4+%i*12)*s^2;-3-%i*8+(-3+%i*12)*s+(3-%i*16)*s^2,6+%i*10+(6-%i*15)*s+(-6+%i*20)*s^2]);
+assert_checkequal(pc - empty, 1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc - r, -1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc - c, (1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc - R, [%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,-1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2;-2+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,-3+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2]);
+assert_checkequal(pc - C, [(1-%i*3)*s+(-1+%i*4)*s^2,-1-%i*2+(1-%i*3)*s+(-1+%i*4)*s^2;-2-%i*4+(1-%i*3)*s+(-1+%i*4)*s^2,-3-%i*6+(1-%i*3)*s+(-1+%i*4)*s^2]);
+assert_checkequal(pc - e, %i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc - ec, -4+%i+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc - p, %i*2+(-%i*3)*s+(%i*4)*s^2);
+assert_checkequal(pc - pc, 0*s);
+assert_checkequal(pc - P, [-1+%i*2+(-1-%i*3)*s+(1+%i*4)*s^2,4+%i*2+(4-%i*3)*s+(-4+%i*4)*s^2;-3+%i*2+(-3-%i*3)*s+(3+%i*4)*s^2,6+%i*2+(6-%i*3)*s+(-6+%i*4)*s^2]);
+assert_checkequal(pc - PC, [-1-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2,4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2;-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2,6+%i*12+(6-%i*18)*s+(-6+%i*24)*s^2]);
+assert_checkequal(P - empty, [2+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-5-5*s+5*s^2]);
+assert_checkequal(P - r, [2*s-2*s^2,-5-3*s+3*s^2;2+4*s-4*s^2,-7-5*s+5*s^2]);
+assert_checkequal(P - c, [1-%i*2+2*s-2*s^2,-4-%i*2-3*s+3*s^2;3-%i*2+4*s-4*s^2,-6-%i*2-5*s+5*s^2]);
+assert_checkequal(P - R, [1+2*s-2*s^2,-5-3*s+3*s^2;1+4*s-4*s^2,-9-5*s+5*s^2]);
+assert_checkequal(P - C, [1-%i*2+2*s-2*s^2,-5-%i*4-3*s+3*s^2;1-%i*6+4*s-4*s^2,-9-%i*8-5*s+5*s^2]);
+assert_checkequal(P - e, [1+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-6-5*s+5*s^2]);
+assert_checkequal(P - ec, [-3-%i+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-10-%i-5*s+5*s^2]);
+assert_checkequal(P - p, [1+s-s^2,-4-4*s+4*s^2;3+3*s-3*s^2,-6-6*s+6*s^2]);
+assert_checkequal(P - pc, [1-%i*2+(1+%i*3)*s+(-1-%i*4)*s^2,-4-%i*2+(-4+%i*3)*s+(4-%i*4)*s^2;3-%i*2+(3+%i*3)*s+(-3-%i*4)*s^2,-6-%i*2+(-6+%i*3)*s+(6-%i*4)*s^2]);
+assert_checkequal(P - P, [0*s,0*s;0*s,0*s]);
+assert_checkequal(P - PC, [-%i*4+(%i*6)*s+(-%i*8)*s^2,%i*6+(-%i*9)*s+(%i*12)*s^2;-%i*8+(%i*12)*s+(-%i*16)*s^2,%i*10+(-%i*15)*s+(%i*20)*s^2]);
+assert_checkequal(PC - empty, [2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-5-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - r, [%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-5-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;2+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-7-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - c, [1+%i*2+(2-%i*6)*s+(-2+%i*8)*s^2,-4-%i*8+(-3+%i*9)*s+(3-%i*12)*s^2;3+%i*6+(4-%i*12)*s+(-4+%i*16)*s^2,-6-%i*12+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - R, [1+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-5-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;1+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-9-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - C, [1+%i*2+(2-%i*6)*s+(-2+%i*8)*s^2,-5-%i*10+(-3+%i*9)*s+(3-%i*12)*s^2;1+%i*2+(4-%i*12)*s+(-4+%i*16)*s^2,-9-%i*18+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - e, [1+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-6-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - ec, [-3+%i*3+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-10-%i*11+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - p, [1+%i*4+(1-%i*6)*s+(-1+%i*8)*s^2,-4-%i*6+(-4+%i*9)*s+(4-%i*12)*s^2;3+%i*8+(3-%i*12)*s+(-3+%i*16)*s^2,-6-%i*10+(-6+%i*15)*s+(6-%i*20)*s^2]);
+assert_checkequal(PC - pc, [1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,-4-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2;3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2,-6-%i*12+(-6+%i*18)*s+(6-%i*24)*s^2]);
+assert_checkequal(PC - P, [%i*4+(-%i*6)*s+(%i*8)*s^2,-%i*6+(%i*9)*s+(-%i*12)*s^2;%i*8+(-%i*12)*s+(%i*16)*s^2,-%i*10+(%i*15)*s+(-%i*20)*s^2]);
+assert_checkequal(PC - PC, [0*s,0*s;0*s,0*s]);
+assert_checkequal(SP - empty, sparse([1,2;3,10;4,5],[1;3;2],[4,10]));
 assert_checkequal(SP - r, [-2,-1,-2,-2,-2,-2,-2,-2,-2,-2;-2,-2,-2,-2,-2,-2,-2,-2,-2,-2;-2,-2,-2,-2,-2,-2,-2,-2,-2,1;-2,-2,-2,-2,0,-2,-2,-2,-2,-2]);
 assert_checkequal(SP - c, [-1-%i*2,-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2;-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2;-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2, 2-%i*2;-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2, 1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2]);
+assert_checkequal(SP - e, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-1;1;-1;-1;3;-1;2],[4,10]));
+assert_checkequal(SP - ec, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-5-%i; 1;-5-%i;-5-%i; 3;-5-%i; 2],[4,10]));
+assert_checkequal(SP - SP, sparse([],[],[4,10]));
+assert_checkequal(SP - SPC, sparse([1,2;3,10;4,5],[-%i*4;-%i*12;-%i*8],[4,10]));
+assert_checkequal(SPC - empty, sparse([1,2;3,10;4,5],[ 1+%i*4; 3+%i*12; 2+%i*8],[4,10]));
 assert_checkequal(SPC - r, [-2,-1+%i*4,-2,-2,-2,-2,-2,-2,-2,-2;-2,-2,-2,-2,-2,-2,-2,-2,-2,-2;-2,-2,-2,-2,-2,-2,-2,-2,-2, 1+%i*12;-2,-2,-2,-2,%i*8,-2,-2,-2,-2,-2]);
 assert_checkequal(SPC - c, [-1-%i*2,%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2;-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2;-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2, 2+%i*10;-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2, 1+%i*6,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2]);
+assert_checkequal(SPC - e, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-1; 1+%i*4;-1;-1; 3+%i*12;-1; 2+%i*8],[4,10]));
+assert_checkequal(SPC - ec, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-5-%i; 1+%i*4;-5-%i;-5-%i; 3+%i*12;-5-%i; 2+%i*8],[4,10]));
+assert_checkequal(SPC - SP, sparse([1,2;3,10;4,5],[%i*4;%i*12;%i*8],[4,10]));
+assert_checkequal(SPC - SPC, sparse([],[],[4,10]));
+assert_checkequal(i8 - empty, int8(-8));
+assert_checkequal(i8 - r, int8(-10));
+assert_checkequal(i8 - R, int8([-9,-10;-11,-12]));
+assert_checkequal(i8 - i8, int8(0));
+assert_checkequal(i8 - I8, int8([0,8;16,24]));
+assert_checkequal(i8 - ui8, uint8(240));
+assert_checkequal(i8 - UI8, uint8([240,232;224,216]));
+assert_checkequal(i8 - i16, int16(8));
+assert_checkequal(i8 - I16, int16([8,24;40,56]));
+assert_checkequal(i8 - ui16, uint16(65512));
+assert_checkequal(i8 - UI16, uint16([65512,65496;65480,65464]));
+assert_checkequal(i8 - i32, int32(24));
+assert_checkequal(i8 - I32, int32([24,56;88,120]));
+assert_checkequal(i8 - ui32, uint32(4294967256));
+assert_checkequal(i8 - UI32, uint32([4294967256,4294967224;4294967192,4294967160]));
+assert_checkequal(I8 - empty, int8([-8,-16;-24,-32]));
+assert_checkequal(I8 - r, int8([-10,-18;-26,-34]));
+assert_checkequal(I8 - R, int8([-9,-18;-27,-36]));
+assert_checkequal(I8 - i8, int8([0,-8;-16,-24]));
+assert_checkequal(I8 - I8, int8([0,0;0,0]));
+assert_checkequal(I8 - ui8, uint8([240,232;224,216]));
+assert_checkequal(I8 - UI8, uint8([240,224;208,192]));
+assert_checkequal(I8 - i16, int16([8,0;-8,-16]));
+assert_checkequal(I8 - I16, int16([8,16;24,32]));
+assert_checkequal(I8 - ui16, uint16([65512,65504;65496,65488]));
+assert_checkequal(I8 - UI16, uint16([65512,65488;65464,65440]));
+assert_checkequal(I8 - i32, int32([24,16;8,0]));
+assert_checkequal(I8 - I32, int32([24,48;72,96]));
+assert_checkequal(I8 - ui32, uint32([4294967256,4294967248;4294967240,4294967232]));
+assert_checkequal(I8 - UI32, uint32([4294967256,4294967216;4294967176,4294967136]));
+assert_checkequal(ui8 - empty, uint8(8));
+assert_checkequal(ui8 - r, uint8(6));
+assert_checkequal(ui8 - R, uint8([7,6;5,4]));
+assert_checkequal(ui8 - i8, uint8(16));
+assert_checkequal(ui8 - I8, uint8([16,24;32,40]));
+assert_checkequal(ui8 - ui8, uint8(0));
+assert_checkequal(ui8 - UI8, uint8([0,248;240,232]));
+assert_checkequal(ui8 - i16, uint16(24));
+assert_checkequal(ui8 - I16, uint16([24,40;56,72]));
+assert_checkequal(ui8 - ui16, uint16(65528));
+assert_checkequal(ui8 - UI16, uint16([65528,65512;65496,65480]));
+assert_checkequal(ui8 - i32, uint32(40));
+assert_checkequal(ui8 - I32, uint32([40,72;104,136]));
+assert_checkequal(ui8 - ui32, uint32(4294967272));
+assert_checkequal(ui8 - UI32, uint32([4294967272,4294967240;4294967208,4294967176]));
+assert_checkequal(UI8 - empty, uint8([8,16;24,32]));
+assert_checkequal(UI8 - r, uint8([6,14;22,30]));
+assert_checkequal(UI8 - R, uint8([7,14;21,28]));
+assert_checkequal(UI8 - i8, uint8([16,24;32,40]));
+assert_checkequal(UI8 - I8, uint8([16,32;48,64]));
+assert_checkequal(UI8 - ui8, uint8([0,8;16,24]));
+assert_checkequal(UI8 - UI8, uint8([0,0;0,0]));
+assert_checkequal(UI8 - i16, uint16([24,32;40,48]));
+assert_checkequal(UI8 - I16, uint16([24,48;72,96]));
+assert_checkequal(UI8 - ui16, uint16([65528,0;8,16]));
+assert_checkequal(UI8 - UI16, uint16([65528,65520;65512,65504]));
+assert_checkequal(UI8 - i32, uint32([40,48;56,64]));
+assert_checkequal(UI8 - I32, uint32([40,80;120,160]));
+assert_checkequal(UI8 - ui32, uint32([4294967272,4294967280;4294967288,0]));
+assert_checkequal(UI8 - UI32, uint32([4294967272,4294967248;4294967224,4294967200]));
+assert_checkequal(i16 - empty, int16(-16));
+assert_checkequal(i16 - r, int16(-18));
+assert_checkequal(i16 - R, int16([-17,-18;-19,-20]));
+assert_checkequal(i16 - i8, int16(-8));
+assert_checkequal(i16 - I8, int16([-8,0;8,16]));
+assert_checkequal(i16 - ui8, uint16(65512));
+assert_checkequal(i16 - UI8, uint16([65512,65504;65496,65488]));
+assert_checkequal(i16 - i16, int16(0));
+assert_checkequal(i16 - I16, int16([0,16;32,48]));
+assert_checkequal(i16 - ui16, uint16(65504));
+assert_checkequal(i16 - UI16, uint16([65504,65488;65472,65456]));
+assert_checkequal(i16 - i32, int32(16));
+assert_checkequal(i16 - I32, int32([16,48;80,112]));
+assert_checkequal(i16 - ui32, uint32(4294967248));
+assert_checkequal(i16 - UI32, uint32([4294967248,4294967216;4294967184,4294967152]));
+assert_checkequal(I16 - empty, int16([-16,-32;-48,-64]));
+assert_checkequal(I16 - r, int16([-18,-34;-50,-66]));
+assert_checkequal(I16 - R, int16([-17,-34;-51,-68]));
+assert_checkequal(I16 - i8, int16([-8,-24;-40,-56]));
+assert_checkequal(I16 - I8, int16([-8,-16;-24,-32]));
+assert_checkequal(I16 - ui8, uint16([65512,65496;65480,65464]));
+assert_checkequal(I16 - UI8, uint16([65512,65488;65464,65440]));
+assert_checkequal(I16 - i16, int16([0,-16;-32,-48]));
+assert_checkequal(I16 - I16, int16([0,0;0,0]));
+assert_checkequal(I16 - ui16, uint16([65504,65488;65472,65456]));
+assert_checkequal(I16 - UI16, uint16([65504,65472;65440,65408]));
+assert_checkequal(I16 - i32, int32([16,0;-16,-32]));
+assert_checkequal(I16 - I32, int32([16,32;48,64]));
+assert_checkequal(I16 - ui32, uint32([4294967248,4294967232;4294967216,4294967200]));
+assert_checkequal(I16 - UI32, uint32([4294967248,4294967200;4294967152,4294967104]));
+assert_checkequal(ui16 - empty, uint16(16));
+assert_checkequal(ui16 - r, uint16(14));
+assert_checkequal(ui16 - R, uint16([15,14;13,12]));
+assert_checkequal(ui16 - i8, uint16(24));
+assert_checkequal(ui16 - I8, uint16([24,32;40,48]));
+assert_checkequal(ui16 - ui8, uint16(8));
+assert_checkequal(ui16 - UI8, uint16([8,0;65528,65520]));
+assert_checkequal(ui16 - i16, uint16(32));
+assert_checkequal(ui16 - I16, uint16([32,48;64,80]));
+assert_checkequal(ui16 - ui16, uint16(0));
+assert_checkequal(ui16 - UI16, uint16([0,65520;65504,65488]));
+assert_checkequal(ui16 - i32, uint32(48));
+assert_checkequal(ui16 - I32, uint32([48,80;112,144]));
+assert_checkequal(ui16 - ui32, uint32(4294967280));
+assert_checkequal(ui16 - UI32, uint32([4294967280,4294967248;4294967216,4294967184]));
+assert_checkequal(UI16 - empty, uint16([16,32;48,64]));
+assert_checkequal(UI16 - r, uint16([14,30;46,62]));
+assert_checkequal(UI16 - R, uint16([15,30;45,60]));
+assert_checkequal(UI16 - i8, uint16([24,40;56,72]));
+assert_checkequal(UI16 - I8, uint16([24,48;72,96]));
+assert_checkequal(UI16 - ui8, uint16([8,24;40,56]));
+assert_checkequal(UI16 - UI8, uint16([8,16;24,32]));
+assert_checkequal(UI16 - i16, uint16([32,48;64,80]));
+assert_checkequal(UI16 - I16, uint16([32,64;96,128]));
+assert_checkequal(UI16 - ui16, uint16([0,16;32,48]));
+assert_checkequal(UI16 - UI16, uint16([0,0;0,0]));
+assert_checkequal(UI16 - i32, uint32([48,64;80,96]));
+assert_checkequal(UI16 - I32, uint32([48,96;144,192]));
+assert_checkequal(UI16 - ui32, uint32([4294967280,0;16,32]));
+assert_checkequal(UI16 - UI32, uint32([4294967280,4294967264;4294967248,4294967232]));
+assert_checkequal(i32 - empty, int32(-32));
+assert_checkequal(i32 - r, int32(-34));
+assert_checkequal(i32 - R, int32([-33,-34;-35,-36]));
+assert_checkequal(i32 - i8, int32(-24));
+assert_checkequal(i32 - I8, int32([-24,-16;-8,0]));
+assert_checkequal(i32 - ui8, uint32(4294967256));
+assert_checkequal(i32 - UI8, uint32([4294967256,4294967248;4294967240,4294967232]));
+assert_checkequal(i32 - i16, int32(-16));
+assert_checkequal(i32 - I16, int32([-16,0;16,32]));
+assert_checkequal(i32 - ui16, uint32(4294967248));
+assert_checkequal(i32 - UI16, uint32([4294967248,4294967232;4294967216,4294967200]));
+assert_checkequal(i32 - i32, int32(0));
+assert_checkequal(i32 - I32, int32([0,32;64,96]));
+assert_checkequal(i32 - ui32, uint32(4294967232));
+assert_checkequal(i32 - UI32, uint32([4294967232,4294967200;4294967168,4294967136]));
+assert_checkequal(I32 - empty, int32([-32,-64;-96,-128]));
+assert_checkequal(I32 - r, int32([-34,-66;-98,-130]));
+assert_checkequal(I32 - R, int32([-33,-66;-99,-132]));
+assert_checkequal(I32 - i8, int32([-24,-56;-88,-120]));
+assert_checkequal(I32 - I8, int32([-24,-48;-72,-96]));
+assert_checkequal(I32 - ui8, uint32([4294967256,4294967224;4294967192,4294967160]));
+assert_checkequal(I32 - UI8, uint32([4294967256,4294967216;4294967176,4294967136]));
+assert_checkequal(I32 - i16, int32([-16,-48;-80,-112]));
+assert_checkequal(I32 - I16, int32([-16,-32;-48,-64]));
+assert_checkequal(I32 - ui16, uint32([4294967248,4294967216;4294967184,4294967152]));
+assert_checkequal(I32 - UI16, uint32([4294967248,4294967200;4294967152,4294967104]));
+assert_checkequal(I32 - i32, int32([0,-32;-64,-96]));
+assert_checkequal(I32 - I32, int32([0,0;0,0]));
+assert_checkequal(I32 - ui32, uint32([4294967232,4294967200;4294967168,4294967136]));
+assert_checkequal(I32 - UI32, uint32([4294967232,4294967168;4294967104,4294967040]));
+assert_checkequal(ui32 - empty, uint32(32));
+assert_checkequal(ui32 - r, uint32(30));
+assert_checkequal(ui32 - R, uint32([31,30;29,28]));
+assert_checkequal(ui32 - i8, uint32(40));
+assert_checkequal(ui32 - I8, uint32([40,48;56,64]));
+assert_checkequal(ui32 - ui8, uint32(24));
+assert_checkequal(ui32 - UI8, uint32([24,16;8,0]));
+assert_checkequal(ui32 - i16, uint32(48));
+assert_checkequal(ui32 - I16, uint32([48,64;80,96]));
+assert_checkequal(ui32 - ui16, uint32(16));
+assert_checkequal(ui32 - UI16, uint32([16,0;4294967280,4294967264]));
+assert_checkequal(ui32 - i32, uint32(64));
+assert_checkequal(ui32 - I32, uint32([64,96;128,160]));
+assert_checkequal(ui32 - ui32, uint32(0));
+assert_checkequal(ui32 - UI32, uint32([0,4294967264;4294967232,4294967200]));
+assert_checkequal(UI32 - empty, uint32([32,64;96,128]));
+assert_checkequal(UI32 - r, uint32([30,62;94,126]));
+assert_checkequal(UI32 - R, uint32([31,62;93,124]));
+assert_checkequal(UI32 - i8, uint32([40,72;104,136]));
+assert_checkequal(UI32 - I8, uint32([40,80;120,160]));
+assert_checkequal(UI32 - ui8, uint32([24,56;88,120]));
+assert_checkequal(UI32 - UI8, uint32([24,48;72,96]));
+assert_checkequal(UI32 - i16, uint32([48,80;112,144]));
+assert_checkequal(UI32 - I16, uint32([48,96;144,192]));
+assert_checkequal(UI32 - ui16, uint32([16,48;80,112]));
+assert_checkequal(UI32 - UI16, uint32([16,32;48,64]));
+assert_checkequal(UI32 - i32, uint32([64,96;128,160]));
+assert_checkequal(UI32 - I32, uint32([64,128;192,256]));
+assert_checkequal(UI32 - ui32, uint32([0,32;64,96]));
+assert_checkequal(UI32 - UI32, uint32([0,0;0,0]));
 // OPPOSITE
 // - []
 assert_checkequal(-[], []);
@@ -253,20 +415,16 @@ assert_checkequal(-C, [-1-2*%i -2-4*%i;-3-6*%i -4-8*%i]);
 assert_checkequal(-i8, int8(8));
 assert_checkequal(-i16, int16(16));
 assert_checkequal(-i32, int32(32));
-assert_checkequal(-i64, int64(64));
 assert_checkequal(-ui8, uint8(-8));
 assert_checkequal(-ui16, uint16(-16));
 assert_checkequal(-ui32, uint32(-32));
-assert_checkequal(-ui64, uint64(-64));
 // - INT
 assert_checkequal(-I8, int8([8 16 ; 24 32]));
 assert_checkequal(-I16, int16([16 32 ; 48 64]));
 assert_checkequal(-I32, int32([32 64 ; 96 128]));
-assert_checkequal(-I64, int64([64 128 ; 192 256]));
 assert_checkequal(-UI8, uint8([-8 -16 ; -24 -32]));
 assert_checkequal(-UI16, uint16([-16 -32 ; -48 -64]));
 assert_checkequal(-UI32, uint32([-32 -64 ; -96 -128]));
-assert_checkequal(-UI64, uint64([-64 -128 ; -192 -256]));
 // - SPARSE
 assert_checkequal(-SP, sparse([1,2;4,5;3,10],[-1,-2,-3]));
 // - SPARSE COMPLEX
index b4dbc64..4e1f2e3 100644 (file)
@@ -7,6 +7,8 @@
 
 // <-- JVM NOT MANDATORY -->
 
+s = %s;
+empty = [];
 r = 2;
 R = [1,2;3,4];
 R3(:,:,1) = R;
@@ -25,243 +27,405 @@ SP = sparse([1,2;4,5;3,10],[1,2,3]);
 SPC = sparse([1,2;4,5;3,10],[1,2,3]) * ( 1 + 4*%i);
 
 i8 = int8(-8);
-i16 = int16(-16);
-i32 = int32(-32);
-i64 = int64(-64);
 ui8 = uint8(8);
-ui16 = uint16(16);
-ui32 = uint32(32);
-ui64 = uint64(64);
-
 I8 = int8([-8 -16 ; -24 -32]);
-I16 = int16([-16 -32 ; -48 -64]);
-I32 = int32([-32 -64 ; -96 -128]);
-I64 = int64([-64 -128 ; -192 -256]);
 UI8 = uint8([8 16 ; 24 32]);
+
+I16 = int16([-16 -32 ; -48 -64]);
 UI16 = uint16([16 32 ; 48 64]);
+i16 = int16(-16);
+ui16 = uint16(16);
+
+i32 = int32(-32);
+ui32 = uint32(32);
+I32 = int32([-32 -64 ; -96 -128]);
 UI32 = uint32([32 64 ; 96 128]);
-UI64 = uint64([64 128 ; 192 256]);
-
-//Empty
-assert_checkequal([] - [], []);
-assert_checkequal([] - r, -r);
-assert_checkequal([] - R, -R);
-assert_checkequal([] - R3, -R3);
-assert_checkequal([] - c, -c);
-assert_checkequal([] - C, -C);
-assert_checkequal([] - C3, -C3);
-assert_checkequal([] - e, -e);
-assert_checkequal([] - ec, -ec);
-assert_checkequal([] - p, -p);
-assert_checkequal([] - pc, -pc);
-assert_checkequal([] - P, -P);
-assert_checkequal([] - PC, -PC);
-assert_checkequal([] - SP, -SP);
-assert_checkequal([] - SPC, -SPC);
-assert_checkequal([] - i8, -i8);
-assert_checkequal([] - I8, -I8);
-assert_checkequal([] - ui8, -ui8);
-assert_checkequal([] - UI8, -UI8);
-assert_checkequal([] - ui16, -ui16);
-assert_checkequal([] - UI16, -UI16);
-assert_checkequal([] - ui16, -ui16);
-assert_checkequal([] - UI16, -UI16);
-assert_checkequal([] - ui32, -ui32);
-assert_checkequal([] - UI32, -UI32);
-assert_checkequal([] - ui32, -ui32);
-assert_checkequal([] - UI32, -UI32);
-assert_checkequal([] - ui64, -ui64);
-assert_checkequal([] - UI64, -UI64);
-assert_checkequal([] - ui64, -ui64);
-assert_checkequal([] - UI64, -UI64);
-
-//Identity
-assert_checkequal(e - [], e);
-assert_checkequal(ec - [], ec);
-assert_checkequal(e - r, -1);
-assert_checkequal(ec - r, 3+%i);
-assert_checkequal(e - R, [0 -2;-3 -3]);
-assert_checkequal(ec - R, [4+%i -2;-3 1+%i]);
-assert_checkequal(e - c, -2*%i);
-assert_checkequal(ec - c, 4 - %i);
-assert_checkequal(e - C, [-2*%i -2-4*%i;-3-6*%i -3-8*%i]);
-assert_checkequal(ec - C, [4-%i -2-4*%i;-3-6*%i 1-7*%i]);
-assert_checkequal(e - e, eye() * 0);
-assert_checkequal(ec - e, eye() * (4+%i));
-assert_checkequal(e - ec, eye() * (-4-%i));
-assert_checkequal(ec - ec, eye() * 0 * %i);
-assert_checkequal(e - p, -%s+%s**2);
-assert_checkequal(ec - p, 4-%s+%s**2 + %i);
-assert_checkequal(e - pc, -%s+%s**2 + (-2+3*%s-4*%s**2)*%i);
-assert_checkequal(ec - pc, 4-%s+%s**2 + (-1+3*%s-4*%s**2)*%i);
-assert_checkequal(e - P, [-1-2*%s+2*%s**2 3+3*%s-3*%s**2;-4-4*%s+4*%s**2 6+5*%s-5*%s**2]);
-assert_checkequal(ec - P, [3+%i-2*%s+2*%s^2,3+3*%s-3*%s^2;-4-4*%s+4*%s^2,10+%i+5*%s-5*%s^2]);
-assert_checkequal(e - PC, [-1-%i*4+(-2+%i*6)*%s+(2-%i*8)*%s^2,3+%i*6+(3-%i*9)*%s+(-3+%i*12)*%s^2;-4-%i*8+(-4+%i*12)*%s+(4-%i*16)*%s^2,6+%i*10+(5-%i*15)*%s+(-5+%i*20)*%s^2]);
-assert_checkequal(ec - PC, [3-%i*3+(-2+%i*6)*%s+(2-%i*8)*%s^2,3+%i*6+(3-%i*9)*%s+(-3+%i*12)*%s^2;-4-%i*8+(-4+%i*12)*%s+(4-%i*16)*%s^2,10+%i*11+(5-%i*15)*%s+(-5+%i*20)*%s^2]);
-assert_checkequal(e - SP, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[1;-1;1;1;-3;1;-2],[4,10]));
-assert_checkequal(ec - SP, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i;-1; 5+%i; 5+%i;-3; 5+%i;-2],[4,10]));
-assert_checkequal(e - SPC, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 1;-1-%i*4; 1; 1;-3-%i*12; 1;-2-%i*8],[4,10]));
-assert_checkequal(ec - SPC, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i;-1-%i*4; 5+%i; 5+%i;-3-%i*12; 5+%i;-2-%i*8],[4,10]));
-assert_checkequal(e - i8, int8(9));
-assert_checkequal(e - I8, int8([9 16;24 33]));
-assert_checkequal(e - ui8, uint8(249));
-assert_checkequal(e - UI8, uint8([249 240;232 225]));
-assert_checkequal(e - i16, int16(17));
-assert_checkequal(e - I16, int16([17,32;48,65]));
-assert_checkequal(e - ui16, uint16(65521));
-assert_checkequal(e - UI16, uint16([65521,65504;65488,65473]));
-assert_checkequal(e - i32, int32(33));
-assert_checkequal(e - I32, int32([33,64;96,129]));
-assert_checkequal(e - ui32, uint32(4294967265));
-assert_checkequal(e - UI32, uint32([4294967265,4294967232;4294967200,4294967169]));
-assert_checkequal(e - i64, int64(65));
-assert_checkequal(e - I64, int64([65,128;192,257]));
-
-// double
-assert_checkequal(r - [], r);
-assert_checkequal(r - e, 1);
-assert_checkequal(r - ec, -3-%i);
-assert_checkequal(c - [], c);
-assert_checkequal(c - e, 2*%i);
-assert_checkequal(c - ec, -4+%i);
-assert_checkequal(R - [], R);
-assert_checkequal(R - e, [0 2; 3 3]);
-assert_checkequal(R - ec, [-4-%i, 2; 3,-1-%i]);
-assert_checkequal(C - [], C);
-assert_checkequal(C - e, [%i*2, 2+%i*4; 3+%i*6, 3+%i*8]);
-assert_checkequal(C - ec, [-4+%i, 2+%i*4; 3+%i*6,-1+%i*7]);
 
+assert_checkequal(empty - empty, []);
+assert_checkequal(empty - r, -2);
+assert_checkequal(empty - c, -1-%i*2);
+assert_checkequal(empty - R, [-1,-2;-3,-4]);
+assert_checkequal(empty - C, [-1-%i*2,-2-%i*4;-3-%i*6,-4-%i*8]);
+assert_checkequal(empty - e, (-1)*eye());
+assert_checkequal(empty - ec, (-5-%i)*eye());
+assert_checkequal(empty - p, -1-s+s^2);
+assert_checkequal(empty - pc, -1-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2);
+assert_checkequal(empty - P, [-2-2*s+2*s^2,3+3*s-3*s^2;-4-4*s+4*s^2,5+5*s-5*s^2]);
+assert_checkequal(empty - PC, [-2-%i*4+(-2+%i*6)*s+(2-%i*8)*s^2,3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2;-4-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2,5+%i*10+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(empty - SP, sparse([1,2;3,10;4,5],[-1;-3;-2],[4,10]));
+assert_checkequal(empty - SPC, sparse([1,2;3,10;4,5],[-1-%i*4;-3-%i*12;-2-%i*8],[4,10]));
+assert_checkequal(empty - i8, int8(8));
+assert_checkequal(empty - I8, int8([8,16;24,32]));
+assert_checkequal(empty - ui8, uint8(248));
+assert_checkequal(empty - UI8, uint8([248,240;232,224]));
+assert_checkequal(empty - i16, int16(16));
+assert_checkequal(empty - I16, int16([16,32;48,64]));
+assert_checkequal(empty - ui16, uint16(65520));
+assert_checkequal(empty - UI16, uint16([65520,65504;65488,65472]));
+assert_checkequal(empty - i32, int32(32));
+assert_checkequal(empty - I32, int32([32,64;96,128]));
+assert_checkequal(empty - ui32, uint32(4294967264));
+assert_checkequal(empty - UI32, uint32([4294967264,4294967232;4294967200,4294967168]));
+
+assert_checkequal(r - empty, 2);
 assert_checkequal(r - r, 0);
-assert_checkequal(r - c, 1-%i*2);
-assert_checkequal(c - r, -1+%i*2);
-assert_checkequal(c - c, 0*%i);
-
+assert_checkequal(r - c,  1-%i*2);
 assert_checkequal(r - R, [1,0;-1,-2]);
-rR3ref(:,:,1) = [1,0;-1,-2];
-rR3ref(:,:,2) = [1,-1;0,-2] ;
-assert_checkequal(r - R3, rR3ref);
-
 assert_checkequal(r - C, [ 1-%i*2,-%i*4;-1-%i*6,-2-%i*8]);
-rC3ref(:,:,1) = [ 1-%i*2,-%i*4;-1-%i*6,-2-%i*8];
-rC3ref(:,:,2) = [ 1+%i*2,-1+%i*6;%i*4,-2+%i*8];
-assert_checkequal(r - C3, rC3ref);
-
+assert_checkequal(r - e, 1);
+assert_checkequal(r - ec, -3-%i);
+assert_checkequal(r - p, 1-s+s^2);
+assert_checkequal(r - pc, 1-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2);
+assert_checkequal(r - P, [-2*s+2*s^2,5+3*s-3*s^2;-2-4*s+4*s^2,7+5*s-5*s^2]);
+assert_checkequal(r - PC, [-%i*4+(-2+%i*6)*s+(2-%i*8)*s^2,5+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2;-2-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2,7+%i*10+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(r - SP, [2,1,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,-1;2,2,2,2,0,2,2,2,2,2]);
+assert_checkequal(r - SPC, [ 2, 1-%i*4, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2,-1-%i*12; 2, 2, 2, 2,-%i*8, 2, 2, 2, 2, 2]);
+assert_checkequal(r - i8, int8(10));
+assert_checkequal(r - I8, int8([10,18;26,34]));
+assert_checkequal(r - ui8, uint8(250));
+assert_checkequal(r - UI8, uint8([250,242;234,226]));
+assert_checkequal(r - i16, int16(18));
+assert_checkequal(r - I16, int16([18,34;50,66]));
+assert_checkequal(r - ui16, uint16(65522));
+assert_checkequal(r - UI16, uint16([65522,65506;65490,65474]));
+assert_checkequal(r - i32, int32(34));
+assert_checkequal(r - I32, int32([34,66;98,130]));
+assert_checkequal(r - ui32, uint32(4294967266));
+assert_checkequal(r - UI32, uint32([4294967266,4294967234;4294967202,4294967170]));
+
+assert_checkequal(c - empty,  1+%i*2);
+assert_checkequal(c - r, -1+%i*2);
+assert_checkequal(c - c, 0*%i);
 assert_checkequal(c - R, [%i*2,-1+%i*2;-2+%i*2,-3+%i*2]);
-cR3ref(:,:,1) = [%i*2,-1+%i*2;-2+%i*2,-3+%i*2];
-cR3ref(:,:,2) = [%i*2,-2+%i*2;-1+%i*2,-3+%i*2];
-assert_checkequal(c - R3, cR3ref);
-
 assert_checkequal(c - C, [0,-1-%i*2;-2-%i*4,-3-%i*6]);
-cC3ref(:,:,1) = [0,-1-%i*2;-2-%i*4,-3-%i*6];
-cC3ref(:,:,2) = [%i*4,-2+%i*8;-1+%i*6,-3+%i*10];
-assert_checkequal(c - C3, cC3ref);
-
+assert_checkequal(c - e, %i*2);
+assert_checkequal(c - ec, -4+%i);
+assert_checkequal(c - p, %i*2-s+s^2);
+assert_checkequal(c - pc, (-1+%i*3)*s+(1-%i*4)*s^2);
+assert_checkequal(c - P, [-1+%i*2-2*s+2*s^2,4+%i*2+3*s-3*s^2;-3+%i*2-4*s+4*s^2,6+%i*2+5*s-5*s^2]);
+assert_checkequal(c - PC, [-1-%i*2+(-2+%i*6)*s+(2-%i*8)*s^2,4+%i*8+(3-%i*9)*s+(-3+%i*12)*s^2;-3-%i*6+(-4+%i*12)*s+(4-%i*16)*s^2,6+%i*12+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(c - SP, [ 1+%i*2,%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-2+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
+assert_checkequal(c - SPC, [ 1+%i*2,-%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-2-%i*10; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-1-%i*6, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
+
+assert_checkequal(R - empty, [1,2;3,4]);
 assert_checkequal(R - r, [-1,0;1,2]);
-R3rref(:,:,1) = [-1,0;1,2];
-R3rref(:,:,2) = [-1,1;0,2];
-assert_checkequal(R3 - r, R3rref);
-
 assert_checkequal(R - c, [-%i*2, 1-%i*2; 2-%i*2, 3-%i*2]);
-R3cref(:,:,1) = [-%i*2, 1-%i*2; 2-%i*2, 3-%i*2];
-R3cref(:,:,2) = [-%i*2, 2-%i*2; 1-%i*2, 3-%i*2];
-assert_checkequal(R3 - c, R3cref);
-
-assert_checkequal(C - r, [-1+%i*2,%i*4; 1+%i*6, 2+%i*8]);
-C3rref(:,:,1) = [-1+%i*2,%i*4; 1+%i*6, 2+%i*8];
-C3rref(:,:,2) = [-1-%i*2, 1-%i*6;-%i*4, 2-%i*8];
-assert_checkequal(C3 - r, C3rref);
-
-assert_checkequal(C - c, [0, 1+%i*2; 2+%i*4, 3+%i*6]);
-C3cref(:,:,1) = [0, 1+%i*2; 2+%i*4, 3+%i*6];
-C3cref(:,:,2) = [-%i*4, 2-%i*8; 1-%i*6, 3-%i*10];
-assert_checkequal(C3 - c, C3cref);
-
 assert_checkequal(R - R, [0,0;0,0]);
-R3R3ref(:,:,1) = [0,0;0,0];
-R3R3ref(:,:,2) = [0,0;0,0];
-assert_checkequal(R3 - R3, R3R3ref);
-
 assert_checkequal(R - C, [-%i*2,-%i*4;-%i*6,-%i*8]);
-R3C3ref(:,:,1) = [-%i*2,-%i*4;-%i*6,-%i*8];
-R3C3ref(:,:,2) = [%i*2,%i*6;%i*4,%i*8];
-assert_checkequal(R3 - C3, R3C3ref);
-
+assert_checkequal(R - e, [0,2;3,3]);
+assert_checkequal(R - ec, [-4-%i, 2; 3,-1-%i]);
+assert_checkequal(R - p, [-s+s^2,1-s+s^2;2-s+s^2,3-s+s^2]);
+assert_checkequal(R - pc, [-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2,1-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2;2-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2,3-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2]);
+assert_checkequal(R - P, [-1-2*s+2*s^2,5+3*s-3*s^2;-1-4*s+4*s^2,9+5*s-5*s^2]);
+assert_checkequal(R - PC, [-1-%i*4+(-2+%i*6)*s+(2-%i*8)*s^2,5+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2;-1-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2,9+%i*10+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(R - i8, int8([9,10;11,12]));
+assert_checkequal(R - I8, int8([9,18;27,36]));
+assert_checkequal(R - ui8, uint8([249,250;251,252]));
+assert_checkequal(R - UI8, uint8([249,242;235,228]));
+assert_checkequal(R - i16, int16([17,18;19,20]));
+assert_checkequal(R - I16, int16([17,34;51,68]));
+assert_checkequal(R - ui16, uint16([65521,65522;65523,65524]));
+assert_checkequal(R - UI16, uint16([65521,65506;65491,65476]));
+assert_checkequal(R - i32, int32([33,34;35,36]));
+assert_checkequal(R - I32, int32([33,66;99,132]));
+assert_checkequal(R - ui32, uint32([4294967265,4294967266;4294967267,4294967268]));
+assert_checkequal(R - UI32, uint32([4294967265,4294967234;4294967203,4294967172]));
+
+assert_checkequal(C - empty, [ 1+%i*2, 2+%i*4; 3+%i*6, 4+%i*8]);
+assert_checkequal(C - r, [-1+%i*2,%i*4; 1+%i*6, 2+%i*8]);
+assert_checkequal(C - c, [0, 1+%i*2; 2+%i*4, 3+%i*6]);
 assert_checkequal(C - R, [%i*2,%i*4;%i*6,%i*8]);
-C3R3ref(:,:,1) = [%i*2,%i*4;%i*6,%i*8];
-C3R3ref(:,:,2) = [-%i*2,-%i*6;-%i*4,-%i*8];
-assert_checkequal(C3 - R3, C3R3ref);
+assert_checkequal(C - C, [0,0;0,0] * %i);
+assert_checkequal(C - e, [%i*2, 2+%i*4; 3+%i*6, 3+%i*8]);
+assert_checkequal(C - ec, [-4+%i, 2+%i*4; 3+%i*6,-1+%i*7]);
+assert_checkequal(C - p, [%i*2-s+s^2,1+%i*4-s+s^2;2+%i*6-s+s^2,3+%i*8-s+s^2]);
+assert_checkequal(C - pc, [(-1+%i*3)*s+(1-%i*4)*s^2,1+%i*2+(-1+%i*3)*s+(1-%i*4)*s^2;2+%i*4+(-1+%i*3)*s+(1-%i*4)*s^2,3+%i*6+(-1+%i*3)*s+(1-%i*4)*s^2]);
+assert_checkequal(C - P, [-1+%i*2-2*s+2*s^2,5+%i*4+3*s-3*s^2;-1+%i*6-4*s+4*s^2,9+%i*8+5*s-5*s^2]);
+assert_checkequal(C - PC, [-1-%i*2+(-2+%i*6)*s+(2-%i*8)*s^2,5+%i*10+(3-%i*9)*s+(-3+%i*12)*s^2;-1-%i*2+(-4+%i*12)*s+(4-%i*16)*s^2,9+%i*18+(5-%i*15)*s+(-5+%i*20)*s^2]);
 
-assert_checkequal(C - C, [0,0;0,0]*%i);
-C3C3ref(:,:,1) = [0,0;0,0];
-C3C3ref(:,:,2) = [0,0;0,0];
-assert_checkequal(C3 - C3, C3C3ref*%i);
+assert_checkequal(e - empty, eye());
+assert_checkequal(e - r, -1);
+assert_checkequal(e - c, -%i*2);
+assert_checkequal(e - R, [0,-2;-3,-3]);
+assert_checkequal(e - C, [-%i*2,-2-%i*4;-3-%i*6,-3-%i*8]);
+assert_checkequal(e - e, (0)*eye());
+assert_checkequal(e - ec, (-4-%i)*eye());
+assert_checkequal(e - p, -s+s^2);
+assert_checkequal(e - pc, -%i*2+(-1+%i*3)*s+(1-%i*4)*s^2);
+assert_checkequal(e - P, [-1-2*s+2*s^2,3+3*s-3*s^2;-4-4*s+4*s^2,6+5*s-5*s^2]);
+assert_checkequal(e - PC, [-1-%i*4+(-2+%i*6)*s+(2-%i*8)*s^2,3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2;-4-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2,6+%i*10+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(e - SP, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[1;-1;1;1;-3;1;-2],[4,10]));
+assert_checkequal(e - SPC, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 1;-1-%i*4; 1; 1;-3-%i*12; 1;-2-%i*8],[4,10]));
 
-assert_checkequal(r - SP, [2,1,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,2;2,2,2,2,2,2,2,2,2,-1;2,2,2,2,0,2,2,2,2,2] );
-assert_checkequal(r - SPC, [ 2, 1-%i*4, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2, 2; 2, 2, 2, 2, 2, 2, 2, 2, 2,-1-%i*12; 2, 2, 2, 2,-%i*8, 2, 2, 2, 2, 2]);
-assert_checkequal(c - SP, [ 1+%i*2,%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+ %i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-2+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
-assert_checkequal(c - SPC, [ 1+%i*2,-%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2;1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-2-%i*10; 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2,-1-%i*6, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2, 1+%i*2]);
-
-
-// polynom
-assert_checkequal(p - [], p);
-assert_checkequal(p - e, %s - %s**2);
-assert_checkequal(p - ec, -4-%i+%s-%s**2);
-assert_checkequal(p - r, -1+%s-%s**2);
-assert_checkequal(p - c, -%i*2+%s-%s**2);
-assert_checkequal(p - R, [%s-%s**2,-1+%s-%s**2;-2+%s-%s**2,-3+%s-%s**2]);
-assert_checkequal(p - C, [-%i*2+%s-%s**2,-1-%i*4+%s-%s**2;-2-%i*6+%s-%s**2,-3-%i*8+%s-%s**2]);
-
-assert_checkequal(pc - [], pc);
-assert_checkequal(pc - e, %i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2);
-assert_checkequal(pc - ec, -4+%i+(1-%i*3)*%s+(-1+%i*4)*%s**2);
-assert_checkequal(pc - r, -1+%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2);
-assert_checkequal(pc - c, (1-%i*3)*%s+(-1+%i*4)*%s**2);
-assert_checkequal(pc - R, [%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2,-1+%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2;-2+%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2,-3+%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2]);
-assert_checkequal(pc - C, [(1-%i*3)*%s+(-1+%i*4)*%s**2,-1-%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2;-2-%i*4+(1-%i*3)*%s+(-1+%i*4)*%s**2,-3-%i*6+(1-%i*3)*%s+(-1+%i*4)*%s**2]);
-
-assert_checkequal(P - [], P);
-assert_checkequal(P - e, [1+2*%s-2*%s**2,-3-3*%s+3*%s**2;4+4*%s-4*%s**2,-6-5*%s+5*%s**2] );
-assert_checkequal(P - ec, [-3-%i+2*%s-2*%s**2,-3-3*%s+3*%s**2;4+4*%s-4*%s**2,-10-%i-5*%s+5*%s**2]);
-assert_checkequal(P - r, [2*%s-2*%s**2,-5-3*%s+3*%s**2;2+4*%s-4*%s**2,-7-5*%s+5*%s**2]);
-assert_checkequal(P - c, [1-%i*2+2*%s-2*%s**2,-4-%i*2-3*%s+3*%s**2;3-%i*2+4*%s-4*%s**2,-6-%i*2-5*%s+5*%s**2]);
-assert_checkequal(P - R, [1+2*%s-2*%s**2,-5-3*%s+3*%s**2;1+4*%s-4*%s**2,-9-5*%s+5*%s**2] );
-assert_checkequal(P - C, [1-%i*2+2*%s-2*%s**2,-5-%i*4-3*%s+3*%s**2;1-%i*6+4*%s-4*%s**2,-9-%i*8-5*%s+5*%s**2]);
-
-assert_checkequal(PC - [], PC);
-assert_checkequal(PC - e, [1+%i*4+(2-%i*6)*%s+(-2+%i*8)*%s**2,-3-%i*6+(-3+%i*9)*%s+(3-%i*12)*%s**2;4+%i*8+(4-%i*12)*%s+(-4+%i*16)*%s**2,-6-%i*10+(-5+%i*15)*%s+(5-%i*20)*%s**2]);
-assert_checkequal(PC - ec, [-3+%i*3+(2-%i*6)*%s+(-2+%i*8)*%s**2,-3-%i*6+(-3+%i*9)*%s+(3-%i*12)*%s**2;4+%i*8+(4-%i*12)*%s+(-4+%i*16)*%s**2,-10-%i*11+(-5+%i*15)*%s+(5-%i*20)*%s**2]);
-assert_checkequal(PC - r, [%i*4+(2-%i*6)*%s+(-2+%i*8)*%s**2,-5-%i*6+(-3+%i*9)*%s+(3-%i*12)*%s**2;2+%i*8+(4-%i*12)*%s+(-4+%i*16)*%s**2,-7-%i*10+(-5+%i*15)*%s+(5-%i*20)*%s**2]);
-assert_checkequal(PC - c, [1+%i*2+(2-%i*6)*%s+(-2+%i*8)*%s**2,-4-%i*8+(-3+%i*9)*%s+(3-%i*12)*%s**2;3+%i*6+(4-%i*12)*%s+(-4+%i*16)*%s**2,-6-%i*12+(-5+%i*15)*%s+(5-%i*20)*%s**2]);
-assert_checkequal(PC - R, [1+%i*4+(2-%i*6)*%s+(-2+%i*8)*%s**2,-5-%i*6+(-3+%i*9)*%s+(3-%i*12)*%s**2;1+%i*8+(4-%i*12)*%s+(-4+%i*16)*%s**2,-9-%i*10+(-5+%i*15)*%s+(5-%i*20)*%s**2]);
-assert_checkequal(PC - C, [1+%i*2+(2-%i*6)*%s+(-2+%i*8)*%s**2,-5-%i*10+(-3+%i*9)*%s+(3-%i*12)*%s**2;1+%i*2+(4-%i*12)*%s+(-4+%i*16)*%s**2,-9-%i*18+(-5+%i*15)*%s+(5-%i*20)*%s**2]);
-
-assert_checkequal(p - p, 0*%s);
-assert_checkequal(p - pc, -%i*2+(%i*3)*%s+(-%i*4)*%s**2);
-assert_checkequal(p - P, [-1-%s+%s**2,4+4*%s-4*%s**2;-3-3*%s+3*%s**2,6+6*%s-6*%s**2]);
-assert_checkequal(p - PC, [-1-%i*4+(-1+%i*6)*%s+(1-%i*8)*%s**2,4+%i*6+(4-%i*9)*%s+(-4+%i*12)*%s**2;-3-%i*8+(-3+%i*12)*%s+(3-%i*16)*%s**2,6+%i*10+(6-%i*15)*%s+(-6+%i*20)*%s**2]);
-assert_checkequal(P - p, [1+%s-%s**2,-4-4*%s+4*%s**2;3+3*%s-3*%s**2,-6-6*%s+6*%s**2]);
-assert_checkequal(P - pc, [1-%i*2+(1+%i*3)*%s+(-1-%i*4)*%s**2,-4-%i*2+(-4+%i*3)*%s+(4-%i*4)*%s**2;3-%i*2+(3+%i*3)*%s+(-3-%i*4)*%s**2,-6-%i*2+(-6+%i*3)*%s+(6-%i*4)*%s**2]);
-assert_checkequal(P - P, [0*%s,0*%s;0*%s,0*%s]);
-assert_checkequal(P - PC, [-%i*4+(%i*6)*%s+(-%i*8)*%s**2,%i*6+(-%i*9)*%s+(%i*12)*%s**2;-%i*8+(%i*12)*%s+(-%i*16)*%s**2,%i*10+(-%i*15)*%s+(%i*20)*%s**2]);
-assert_checkequal(pc - p, %i*2+(-%i*3)*%s+(%i*4)*%s**2);
-assert_checkequal(pc - pc, 0*%s);
-assert_checkequal(pc - P, [-1+%i*2+(-1-%i*3)*%s+(1+%i*4)*%s**2,4+%i*2+(4-%i*3)*%s+(-4+%i*4)*%s**2;-3+%i*2+(-3-%i*3)*%s+(3+%i*4)*%s**2,6+%i*2+(6-%i*3)*%s+(-6+%i*4)*%s**2]);
-assert_checkequal(pc - PC, [-1-%i*2+(-1+%i*3)*%s+(1-%i*4)*%s**2,4+%i*8+(4-%i*12)*%s+(-4+%i*16)*%s**2;-3-%i*6+(-3+%i*9)*%s+(3-%i*12)*%s**2,6+%i*12+(6-%i*18)*%s+(-6+%i*24)*%s**2]);
-assert_checkequal(PC - p, [1+%i*4+(1-%i*6)*%s+(-1+%i*8)*%s**2,-4-%i*6+(-4+%i*9)*%s+(4-%i*12)*%s**2;3+%i*8+(3-%i*12)*%s+(-3+%i*16)*%s**2,-6-%i*10+(-6+%i*15)*%s+(6-%i*20)*%s**2]);
-assert_checkequal(PC - pc, [1+%i*2+(1-%i*3)*%s+(-1+%i*4)*%s**2,-4-%i*8+(-4+%i*12)*%s+(4-%i*16)*%s**2;3+%i*6+(3-%i*9)*%s+(-3+%i*12)*%s**2,-6-%i*12+(-6+%i*18)*%s+(6-%i*24)*%s**2]);
-assert_checkequal(PC - P, [%i*4+(-%i*6)*%s+(%i*8)*%s**2,-%i*6+(%i*9)*%s+(-%i*12)*%s**2;%i*8+(-%i*12)*%s+(%i*16)*%s**2,-%i*10+(%i*15)*%s+(-%i*20)*%s**2]);
-assert_checkequal(PC - PC, [0*%s,0*%s;0*%s,0*%s]);
-
-assert_checkequal(SP - [], SP);
-assert_checkequal(SPC - [], SPC);
-assert_checkequal(SP - e, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-1;1;-1;-1;3;-1;2],[4,10]));
-assert_checkequal(SP - ec, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-5-%i; 1;-5-%i;-5-%i; 3;-5-%i; 2],[4,10]));
-assert_checkequal(SPC - e, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-1; 1+%i*4;-1;-1; 3+%i*12;-1; 2+%i*8],[4,10]));
-assert_checkequal(SPC - ec, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-5-%i; 1+%i*4;-5-%i;-5-%i; 3+%i*12;-5-%i; 2+%i*8],[4,10]));
+assert_checkequal(ec - empty, ( 5+%i)*eye());
+assert_checkequal(ec - r,  3+%i);
+assert_checkequal(ec - c,  4-%i);
+assert_checkequal(ec - R, [ 4+%i,-2;-3, 1+%i]);
+assert_checkequal(ec - C, [ 4-%i,-2-%i*4;-3-%i*6, 1-%i*7]);
+assert_checkequal(ec - e, ( 4+%i)*eye());
+assert_checkequal(ec - ec, (0*%i)*eye());
+assert_checkequal(ec - p, 4+%i-s+s^2);
+assert_checkequal(ec - pc, 4-%i+(-1+%i*3)*s+(1-%i*4)*s^2);
+assert_checkequal(ec - P, [3+%i-2*s+2*s^2,3+3*s-3*s^2;-4-4*s+4*s^2,10+%i+5*s-5*s^2]);
+assert_checkequal(ec - PC, [3-%i*3+(-2+%i*6)*s+(2-%i*8)*s^2,3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2;-4-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2,10+%i*11+(5-%i*15)*s+(-5+%i*20)*s^2]);
+assert_checkequal(ec - SP, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i;-1; 5+%i; 5+%i;-3; 5+%i;-2],[4,10]));
+assert_checkequal(ec - SPC, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[ 5+%i;-1-%i*4; 5+%i; 5+%i;-3-%i*12; 5+%i;-2-%i*8],[4,10]));
+
+assert_checkequal(p - empty, 1+s-s^2);
+assert_checkequal(p - r, -1+s-s^2);
+assert_checkequal(p - c, -%i*2+s-s^2);
+assert_checkequal(p - R, [s-s^2,-1+s-s^2;-2+s-s^2,-3+s-s^2]);
+assert_checkequal(p - C, [-%i*2+s-s^2,-1-%i*4+s-s^2;-2-%i*6+s-s^2,-3-%i*8+s-s^2]);
+assert_checkequal(p - e, s-s^2);
+assert_checkequal(p - ec, -4-%i+s-s^2);
+assert_checkequal(p - p, 0*s);
+assert_checkequal(p - pc, -%i*2+(%i*3)*s+(-%i*4)*s^2);
+assert_checkequal(p - P, [-1-s+s^2,4+4*s-4*s^2;-3-3*s+3*s^2,6+6*s-6*s^2]);
+assert_checkequal(p - PC, [-1-%i*4+(-1+%i*6)*s+(1-%i*8)*s^2,4+%i*6+(4-%i*9)*s+(-4+%i*12)*s^2;-3-%i*8+(-3+%i*12)*s+(3-%i*16)*s^2,6+%i*10+(6-%i*15)*s+(-6+%i*20)*s^2]);
+
+assert_checkequal(pc - empty, 1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc - r, -1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc - c, (1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc - R, [%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,-1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2;-2+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,-3+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2]);
+assert_checkequal(pc - C, [(1-%i*3)*s+(-1+%i*4)*s^2,-1-%i*2+(1-%i*3)*s+(-1+%i*4)*s^2;-2-%i*4+(1-%i*3)*s+(-1+%i*4)*s^2,-3-%i*6+(1-%i*3)*s+(-1+%i*4)*s^2]);
+assert_checkequal(pc - e, %i*2+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc - ec, -4+%i+(1-%i*3)*s+(-1+%i*4)*s^2);
+assert_checkequal(pc - p, %i*2+(-%i*3)*s+(%i*4)*s^2);
+assert_checkequal(pc - pc, 0*s);
+assert_checkequal(pc - P, [-1+%i*2+(-1-%i*3)*s+(1+%i*4)*s^2,4+%i*2+(4-%i*3)*s+(-4+%i*4)*s^2;-3+%i*2+(-3-%i*3)*s+(3+%i*4)*s^2,6+%i*2+(6-%i*3)*s+(-6+%i*4)*s^2]);
+assert_checkequal(pc - PC, [-1-%i*2+(-1+%i*3)*s+(1-%i*4)*s^2,4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2;-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2,6+%i*12+(6-%i*18)*s+(-6+%i*24)*s^2]);
+
+assert_checkequal(P - empty, [2+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-5-5*s+5*s^2]);
+assert_checkequal(P - r, [2*s-2*s^2,-5-3*s+3*s^2;2+4*s-4*s^2,-7-5*s+5*s^2]);
+assert_checkequal(P - c, [1-%i*2+2*s-2*s^2,-4-%i*2-3*s+3*s^2;3-%i*2+4*s-4*s^2,-6-%i*2-5*s+5*s^2]);
+assert_checkequal(P - R, [1+2*s-2*s^2,-5-3*s+3*s^2;1+4*s-4*s^2,-9-5*s+5*s^2]);
+assert_checkequal(P - C, [1-%i*2+2*s-2*s^2,-5-%i*4-3*s+3*s^2;1-%i*6+4*s-4*s^2,-9-%i*8-5*s+5*s^2]);
+assert_checkequal(P - e, [1+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-6-5*s+5*s^2]);
+assert_checkequal(P - ec, [-3-%i+2*s-2*s^2,-3-3*s+3*s^2;4+4*s-4*s^2,-10-%i-5*s+5*s^2]);
+assert_checkequal(P - p, [1+s-s^2,-4-4*s+4*s^2;3+3*s-3*s^2,-6-6*s+6*s^2]);
+assert_checkequal(P - pc, [1-%i*2+(1+%i*3)*s+(-1-%i*4)*s^2,-4-%i*2+(-4+%i*3)*s+(4-%i*4)*s^2;3-%i*2+(3+%i*3)*s+(-3-%i*4)*s^2,-6-%i*2+(-6+%i*3)*s+(6-%i*4)*s^2]);
+assert_checkequal(P - P, [0*s,0*s;0*s,0*s]);
+assert_checkequal(P - PC, [-%i*4+(%i*6)*s+(-%i*8)*s^2,%i*6+(-%i*9)*s+(%i*12)*s^2;-%i*8+(%i*12)*s+(-%i*16)*s^2,%i*10+(-%i*15)*s+(%i*20)*s^2]);
+
+assert_checkequal(PC - empty, [2+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-5-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - r, [%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-5-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;2+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-7-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - c, [1+%i*2+(2-%i*6)*s+(-2+%i*8)*s^2,-4-%i*8+(-3+%i*9)*s+(3-%i*12)*s^2;3+%i*6+(4-%i*12)*s+(-4+%i*16)*s^2,-6-%i*12+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - R, [1+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-5-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;1+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-9-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - C, [1+%i*2+(2-%i*6)*s+(-2+%i*8)*s^2,-5-%i*10+(-3+%i*9)*s+(3-%i*12)*s^2;1+%i*2+(4-%i*12)*s+(-4+%i*16)*s^2,-9-%i*18+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - e, [1+%i*4+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-6-%i*10+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - ec, [-3+%i*3+(2-%i*6)*s+(-2+%i*8)*s^2,-3-%i*6+(-3+%i*9)*s+(3-%i*12)*s^2;4+%i*8+(4-%i*12)*s+(-4+%i*16)*s^2,-10-%i*11+(-5+%i*15)*s+(5-%i*20)*s^2]);
+assert_checkequal(PC - p, [1+%i*4+(1-%i*6)*s+(-1+%i*8)*s^2,-4-%i*6+(-4+%i*9)*s+(4-%i*12)*s^2;3+%i*8+(3-%i*12)*s+(-3+%i*16)*s^2,-6-%i*10+(-6+%i*15)*s+(6-%i*20)*s^2]);
+assert_checkequal(PC - pc, [1+%i*2+(1-%i*3)*s+(-1+%i*4)*s^2,-4-%i*8+(-4+%i*12)*s+(4-%i*16)*s^2;3+%i*6+(3-%i*9)*s+(-3+%i*12)*s^2,-6-%i*12+(-6+%i*18)*s+(6-%i*24)*s^2]);
+assert_checkequal(PC - P, [%i*4+(-%i*6)*s+(%i*8)*s^2,-%i*6+(%i*9)*s+(-%i*12)*s^2;%i*8+(-%i*12)*s+(%i*16)*s^2,-%i*10+(%i*15)*s+(-%i*20)*s^2]);
+assert_checkequal(PC - PC, [0*s,0*s;0*s,0*s]);
+
+assert_checkequal(SP - empty, sparse([1,2;3,10;4,5],[1;3;2],[4,10]));
 assert_checkequal(SP - r, [-2,-1,-2,-2,-2,-2,-2,-2,-2,-2;-2,-2,-2,-2,-2,-2,-2,-2,-2,-2;-2,-2,-2,-2,-2,-2,-2,-2,-2,1;-2,-2,-2,-2,0,-2,-2,-2,-2,-2]);
 assert_checkequal(SP - c, [-1-%i*2,-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2;-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2;-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2, 2-%i*2;-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2, 1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2]);
+assert_checkequal(SP - e, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-1;1;-1;-1;3;-1;2],[4,10]));
+assert_checkequal(SP - ec, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-5-%i; 1;-5-%i;-5-%i; 3;-5-%i; 2],[4,10]));
+assert_checkequal(SP - SP, sparse([],[],[4,10]));
+assert_checkequal(SP - SPC, sparse([1,2;3,10;4,5],[-%i*4;-%i*12;-%i*8],[4,10]));
+
+assert_checkequal(SPC - empty, sparse([1,2;3,10;4,5],[ 1+%i*4; 3+%i*12; 2+%i*8],[4,10]));
 assert_checkequal(SPC - r, [-2,-1+%i*4,-2,-2,-2,-2,-2,-2,-2,-2;-2,-2,-2,-2,-2,-2,-2,-2,-2,-2;-2,-2,-2,-2,-2,-2,-2,-2,-2, 1+%i*12;-2,-2,-2,-2,%i*8,-2,-2,-2,-2,-2]);
 assert_checkequal(SPC - c, [-1-%i*2,%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2;-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2;-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2, 2+%i*10;-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2, 1+%i*6,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2,-1-%i*2]);
+assert_checkequal(SPC - e, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-1; 1+%i*4;-1;-1; 3+%i*12;-1; 2+%i*8],[4,10]));
+assert_checkequal(SPC - ec, sparse([1,1;1,2;2,2;3,3;3,10;4,4;4,5],[-5-%i; 1+%i*4;-5-%i;-5-%i; 3+%i*12;-5-%i; 2+%i*8],[4,10]));
+assert_checkequal(SPC - SP, sparse([1,2;3,10;4,5],[%i*4;%i*12;%i*8],[4,10]));
+assert_checkequal(SPC - SPC, sparse([],[],[4,10]));
+
+assert_checkequal(i8 - empty, int8(-8));
+assert_checkequal(i8 - r, int8(-10));
+assert_checkequal(i8 - R, int8([-9,-10;-11,-12]));
+assert_checkequal(i8 - i8, int8(0));
+assert_checkequal(i8 - I8, int8([0,8;16,24]));
+assert_checkequal(i8 - ui8, uint8(240));
+assert_checkequal(i8 - UI8, uint8([240,232;224,216]));
+assert_checkequal(i8 - i16, int16(8));
+assert_checkequal(i8 - I16, int16([8,24;40,56]));
+assert_checkequal(i8 - ui16, uint16(65512));
+assert_checkequal(i8 - UI16, uint16([65512,65496;65480,65464]));
+assert_checkequal(i8 - i32, int32(24));
+assert_checkequal(i8 - I32, int32([24,56;88,120]));
+assert_checkequal(i8 - ui32, uint32(4294967256));
+assert_checkequal(i8 - UI32, uint32([4294967256,4294967224;4294967192,4294967160]));
+
+assert_checkequal(I8 - empty, int8([-8,-16;-24,-32]));
+assert_checkequal(I8 - r, int8([-10,-18;-26,-34]));
+assert_checkequal(I8 - R, int8([-9,-18;-27,-36]));
+assert_checkequal(I8 - i8, int8([0,-8;-16,-24]));
+assert_checkequal(I8 - I8, int8([0,0;0,0]));
+assert_checkequal(I8 - ui8, uint8([240,232;224,216]));
+assert_checkequal(I8 - UI8, uint8([240,224;208,192]));
+assert_checkequal(I8 - i16, int16([8,0;-8,-16]));
+assert_checkequal(I8 - I16, int16([8,16;24,32]));
+assert_checkequal(I8 - ui16, uint16([65512,65504;65496,65488]));
+assert_checkequal(I8 - UI16, uint16([65512,65488;65464,65440]));
+assert_checkequal(I8 - i32, int32([24,16;8,0]));
+assert_checkequal(I8 - I32, int32([24,48;72,96]));
+assert_checkequal(I8 - ui32, uint32([4294967256,4294967248;4294967240,4294967232]));
+assert_checkequal(I8 - UI32, uint32([4294967256,4294967216;4294967176,4294967136]));
+
+assert_checkequal(ui8 - empty, uint8(8));
+assert_checkequal(ui8 - r, uint8(6));
+assert_checkequal(ui8 - R, uint8([7,6;5,4]));
+assert_checkequal(ui8 - i8, uint8(16));
+assert_checkequal(ui8 - I8, uint8([16,24;32,40]));
+assert_checkequal(ui8 - ui8, uint8(0));
+assert_checkequal(ui8 - UI8, uint8([0,248;240,232]));
+assert_checkequal(ui8 - i16, uint16(24));
+assert_checkequal(ui8 - I16, uint16([24,40;56,72]));
+assert_checkequal(ui8 - ui16, uint16(65528));
+assert_checkequal(ui8 - UI16, uint16([65528,65512;65496,65480]));
+assert_checkequal(ui8 - i32, uint32(40));
+assert_checkequal(ui8 - I32, uint32([40,72;104,136]));
+assert_checkequal(ui8 - ui32, uint32(4294967272));
+assert_checkequal(ui8 - UI32, uint32([4294967272,4294967240;4294967208,4294967176]));
+
+assert_checkequal(UI8 - empty, uint8([8,16;24,32]));
+assert_checkequal(UI8 - r, uint8([6,14;22,30]));
+assert_checkequal(UI8 - R, uint8([7,14;21,28]));
+assert_checkequal(UI8 - i8, uint8([16,24;32,40]));
+assert_checkequal(UI8 - I8, uint8([16,32;48,64]));
+assert_checkequal(UI8 - ui8, uint8([0,8;16,24]));
+assert_checkequal(UI8 - UI8, uint8([0,0;0,0]));
+assert_checkequal(UI8 - i16, uint16([24,32;40,48]));
+assert_checkequal(UI8 - I16, uint16([24,48;72,96]));
+assert_checkequal(UI8 - ui16, uint16([65528,0;8,16]));
+assert_checkequal(UI8 - UI16, uint16([65528,65520;65512,65504]));
+assert_checkequal(UI8 - i32, uint32([40,48;56,64]));
+assert_checkequal(UI8 - I32, uint32([40,80;120,160]));
+assert_checkequal(UI8 - ui32, uint32([4294967272,4294967280;4294967288,0]));
+assert_checkequal(UI8 - UI32, uint32([4294967272,4294967248;4294967224,4294967200]));
+
+assert_checkequal(i16 - empty, int16(-16));
+assert_checkequal(i16 - r, int16(-18));
+assert_checkequal(i16 - R, int16([-17,-18;-19,-20]));
+assert_checkequal(i16 - i8, int16(-8));
+assert_checkequal(i16 - I8, int16([-8,0;8,16]));
+assert_checkequal(i16 - ui8, uint16(65512));
+assert_checkequal(i16 - UI8, uint16([65512,65504;65496,65488]));
+assert_checkequal(i16 - i16, int16(0));
+assert_checkequal(i16 - I16, int16([0,16;32,48]));
+assert_checkequal(i16 - ui16, uint16(65504));
+assert_checkequal(i16 - UI16, uint16([65504,65488;65472,65456]));
+assert_checkequal(i16 - i32, int32(16));
+assert_checkequal(i16 - I32, int32([16,48;80,112]));
+assert_checkequal(i16 - ui32, uint32(4294967248));
+assert_checkequal(i16 - UI32, uint32([4294967248,4294967216;4294967184,4294967152]));
+
+assert_checkequal(I16 - empty, int16([-16,-32;-48,-64]));
+assert_checkequal(I16 - r, int16([-18,-34;-50,-66]));
+assert_checkequal(I16 - R, int16([-17,-34;-51,-68]));
+assert_checkequal(I16 - i8, int16([-8,-24;-40,-56]));
+assert_checkequal(I16 - I8, int16([-8,-16;-24,-32]));
+assert_checkequal(I16 - ui8, uint16([65512,65496;65480,65464]));
+assert_checkequal(I16 - UI8, uint16([65512,65488;65464,65440]));
+assert_checkequal(I16 - i16, int16([0,-16;-32,-48]));
+assert_checkequal(I16 - I16, int16([0,0;0,0]));
+assert_checkequal(I16 - ui16, uint16([65504,65488;65472,65456]));
+assert_checkequal(I16 - UI16, uint16([65504,65472;65440,65408]));
+assert_checkequal(I16 - i32, int32([16,0;-16,-32]));
+assert_checkequal(I16 - I32, int32([16,32;48,64]));
+assert_checkequal(I16 - ui32, uint32([4294967248,4294967232;4294967216,4294967200]));
+assert_checkequal(I16 - UI32, uint32([4294967248,4294967200;4294967152,4294967104]));
+
+assert_checkequal(ui16 - empty, uint16(16));
+assert_checkequal(ui16 - r, uint16(14));
+assert_checkequal(ui16 - R, uint16([15,14;13,12]));
+assert_checkequal(ui16 - i8, uint16(24));
+assert_checkequal(ui16 - I8, uint16([24,32;40,48]));
+assert_checkequal(ui16 - ui8, uint16(8));
+assert_checkequal(ui16 - UI8, uint16([8,0;65528,65520]));
+assert_checkequal(ui16 - i16, uint16(32));
+assert_checkequal(ui16 - I16, uint16([32,48;64,80]));
+assert_checkequal(ui16 - ui16, uint16(0));
+assert_checkequal(ui16 - UI16, uint16([0,65520;65504,65488]));
+assert_checkequal(ui16 - i32, uint32(48));
+assert_checkequal(ui16 - I32, uint32([48,80;112,144]));
+assert_checkequal(ui16 - ui32, uint32(4294967280));
+assert_checkequal(ui16 - UI32, uint32([4294967280,4294967248;4294967216,4294967184]));
+
+assert_checkequal(UI16 - empty, uint16([16,32;48,64]));
+assert_checkequal(UI16 - r, uint16([14,30;46,62]));
+assert_checkequal(UI16 - R, uint16([15,30;45,60]));
+assert_checkequal(UI16 - i8, uint16([24,40;56,72]));
+assert_checkequal(UI16 - I8, uint16([24,48;72,96]));
+assert_checkequal(UI16 - ui8, uint16([8,24;40,56]));
+assert_checkequal(UI16 - UI8, uint16([8,16;24,32]));
+assert_checkequal(UI16 - i16, uint16([32,48;64,80]));
+assert_checkequal(UI16 - I16, uint16([32,64;96,128]));
+assert_checkequal(UI16 - ui16, uint16([0,16;32,48]));
+assert_checkequal(UI16 - UI16, uint16([0,0;0,0]));
+assert_checkequal(UI16 - i32, uint32([48,64;80,96]));
+assert_checkequal(UI16 - I32, uint32([48,96;144,192]));
+assert_checkequal(UI16 - ui32, uint32([4294967280,0;16,32]));
+assert_checkequal(UI16 - UI32, uint32([4294967280,4294967264;4294967248,4294967232]));
+
+assert_checkequal(i32 - empty, int32(-32));
+assert_checkequal(i32 - r, int32(-34));
+assert_checkequal(i32 - R, int32([-33,-34;-35,-36]));
+assert_checkequal(i32 - i8, int32(-24));
+assert_checkequal(i32 - I8, int32([-24,-16;-8,0]));
+assert_checkequal(i32 - ui8, uint32(4294967256));
+assert_checkequal(i32 - UI8, uint32([4294967256,4294967248;4294967240,4294967232]));
+assert_checkequal(i32 - i16, int32(-16));
+assert_checkequal(i32 - I16, int32([-16,0;16,32]));
+assert_checkequal(i32 - ui16, uint32(4294967248));
+assert_checkequal(i32 - UI16, uint32([4294967248,4294967232;4294967216,4294967200]));
+assert_checkequal(i32 - i32, int32(0));
+assert_checkequal(i32 - I32, int32([0,32;64,96]));
+assert_checkequal(i32 - ui32, uint32(4294967232));
+assert_checkequal(i32 - UI32, uint32([4294967232,4294967200;4294967168,4294967136]));
+
+assert_checkequal(I32 - empty, int32([-32,-64;-96,-128]));
+assert_checkequal(I32 - r, int32([-34,-66;-98,-130]));
+assert_checkequal(I32 - R, int32([-33,-66;-99,-132]));
+assert_checkequal(I32 - i8, int32([-24,-56;-88,-120]));
+assert_checkequal(I32 - I8, int32([-24,-48;-72,-96]));
+assert_checkequal(I32 - ui8, uint32([4294967256,4294967224;4294967192,4294967160]));
+assert_checkequal(I32 - UI8, uint32([4294967256,4294967216;4294967176,4294967136]));
+assert_checkequal(I32 - i16, int32([-16,-48;-80,-112]));
+assert_checkequal(I32 - I16, int32([-16,-32;-48,-64]));
+assert_checkequal(I32 - ui16, uint32([4294967248,4294967216;4294967184,4294967152]));
+assert_checkequal(I32 - UI16, uint32([4294967248,4294967200;4294967152,4294967104]));
+assert_checkequal(I32 - i32, int32([0,-32;-64,-96]));
+assert_checkequal(I32 - I32, int32([0,0;0,0]));
+assert_checkequal(I32 - ui32, uint32([4294967232,4294967200;4294967168,4294967136]));
+assert_checkequal(I32 - UI32, uint32([4294967232,4294967168;4294967104,4294967040]));
+
+assert_checkequal(ui32 - empty, uint32(32));
+assert_checkequal(ui32 - r, uint32(30));
+assert_checkequal(ui32 - R, uint32([31,30;29,28]));
+assert_checkequal(ui32 - i8, uint32(40));
+assert_checkequal(ui32 - I8, uint32([40,48;56,64]));
+assert_checkequal(ui32 - ui8, uint32(24));
+assert_checkequal(ui32 - UI8, uint32([24,16;8,0]));
+assert_checkequal(ui32 - i16, uint32(48));
+assert_checkequal(ui32 - I16, uint32([48,64;80,96]));
+assert_checkequal(ui32 - ui16, uint32(16));
+assert_checkequal(ui32 - UI16, uint32([16,0;4294967280,4294967264]));
+assert_checkequal(ui32 - i32, uint32(64));
+assert_checkequal(ui32 - I32, uint32([64,96;128,160]));
+assert_checkequal(ui32 - ui32, uint32(0));
+assert_checkequal(ui32 - UI32, uint32([0,4294967264;4294967232,4294967200]));
+
+assert_checkequal(UI32 - empty, uint32([32,64;96,128]));
+assert_checkequal(UI32 - r, uint32([30,62;94,126]));
+assert_checkequal(UI32 - R, uint32([31,62;93,124]));
+assert_checkequal(UI32 - i8, uint32([40,72;104,136]));
+assert_checkequal(UI32 - I8, uint32([40,80;120,160]));
+assert_checkequal(UI32 - ui8, uint32([24,56;88,120]));
+assert_checkequal(UI32 - UI8, uint32([24,48;72,96]));
+assert_checkequal(UI32 - i16, uint32([48,80;112,144]));
+assert_checkequal(UI32 - I16, uint32([48,96;144,192]));
+assert_checkequal(UI32 - ui16, uint32([16,48;80,112]));
+assert_checkequal(UI32 - UI16, uint32([16,32;48,64]));
+assert_checkequal(UI32 - i32, uint32([64,96;128,160]));
+assert_checkequal(UI32 - I32, uint32([64,128;192,256]));
+assert_checkequal(UI32 - ui32, uint32([0,32;64,96]));
+assert_checkequal(UI32 - UI32, uint32([0,0;0,0]));
 
 
 
@@ -285,20 +449,16 @@ assert_checkequal(-C, [-1-2*%i -2-4*%i;-3-6*%i -4-8*%i]);
 assert_checkequal(-i8, int8(8));
 assert_checkequal(-i16, int16(16));
 assert_checkequal(-i32, int32(32));
-assert_checkequal(-i64, int64(64));
 assert_checkequal(-ui8, uint8(-8));
 assert_checkequal(-ui16, uint16(-16));
 assert_checkequal(-ui32, uint32(-32));
-assert_checkequal(-ui64, uint64(-64));
 // - INT
 assert_checkequal(-I8, int8([8 16 ; 24 32]));
 assert_checkequal(-I16, int16([16 32 ; 48 64]));
 assert_checkequal(-I32, int32([32 64 ; 96 128]));
-assert_checkequal(-I64, int64([64 128 ; 192 256]));
 assert_checkequal(-UI8, uint8([-8 -16 ; -24 -32]));
 assert_checkequal(-UI16, uint16([-16 -32 ; -48 -64]));
 assert_checkequal(-UI32, uint32([-32 -64 ; -96 -128]));
-assert_checkequal(-UI64, uint64([-64 -128 ; -192 -256]));
 // - SPARSE
 assert_checkequal(-SP, sparse([1,2;4,5;3,10],[-1,-2,-3]));
 // - SPARSE COMPLEX