refactor subtraction operation 40/15040/4
Antoine ELIAS [Wed, 13 Aug 2014 07:40:52 +0000 (09:40 +0200)]
Change-Id: Ic511da82b2a8df14e86e04045948fc8343a5ddc2

16 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/matrix_subtraction.h [moved from scilab/modules/ast/includes/operations/matrix_substraction.h with 96% similarity]
scilab/modules/ast/includes/operations/types_opposite.hxx
scilab/modules/ast/includes/operations/types_substraction.hxx [deleted file]
scilab/modules/ast/includes/operations/types_subtraction.hxx [new file with mode: 0644]
scilab/modules/ast/src/c/operations/matrix_subtraction.c [moved from scilab/modules/ast/src/c/operations/matrix_substraction.c with 99% similarity]
scilab/modules/ast/src/cpp/operations/operations.cpp
scilab/modules/ast/src/cpp/operations/types_opposite.cpp
scilab/modules/ast/src/cpp/operations/types_substraction.cpp [deleted file]
scilab/modules/ast/src/cpp/operations/types_subtraction.cpp [new file with mode: 0644]
scilab/modules/ast/src/cpp/types/sparse.cpp
scilab/modules/ast/tests/unit_tests/subtraction.dia.ref
scilab/modules/ast/tests/unit_tests/subtraction.tst

index 8c8c59f..6f90d3e 100644 (file)
@@ -35,13 +35,13 @@ libsciast_la_SOURCES = \
     src/cpp/operations/types_comparison_ne.cpp \
     src/cpp/operations/types_power.cpp \
     src/cpp/operations/types_divide.cpp \
-    src/cpp/operations/types_substraction.cpp \
+    src/cpp/operations/types_subtraction.cpp \
     src/cpp/operations/types_opposite.cpp \
     src/c/operations/matrix_multiplication.c \
     src/c/operations/matrix_transpose.c \
     src/c/operations/matrix_kronecker.c \
     src/c/operations/operations_tools.c \
-    src/c/operations/matrix_substraction.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 \
@@ -150,7 +150,7 @@ libsciast_la_etc_DATA = \
 libsciast_scilab_la_includedir=$(pkgincludedir)
 libsciast_scilab_la_include_HEADERS = \
 includes/operations/matrix_power.h \
-includes/operations/types_substraction.hxx \
+includes/operations/types_subtraction.hxx \
 includes/operations/types_addition.hxx \
 includes/operations/types_kronecker.hxx \
 includes/operations/generic_operations.hxx \
@@ -158,7 +158,7 @@ includes/operations/types_divide.hxx \
 includes/operations/types_finite.hxx \
 includes/operations/types_transposition.hxx \
 includes/operations/matrix_addition.h \
-includes/operations/matrix_substraction.h \
+includes/operations/matrix_subtraction.h \
 includes/operations/doublecomplex.h \
 includes/operations/types_comparison_eq.hxx \
 includes/operations/matrix_transpose.h \
index 66455b2..9514b5b 100644 (file)
@@ -178,13 +178,13 @@ am__libsciast_la_SOURCES_DIST = src/cpp/ast/runvisitor.cpp \
        src/cpp/operations/types_comparison_ne.cpp \
        src/cpp/operations/types_power.cpp \
        src/cpp/operations/types_divide.cpp \
-       src/cpp/operations/types_substraction.cpp \
+       src/cpp/operations/types_subtraction.cpp \
        src/cpp/operations/types_opposite.cpp \
        src/c/operations/matrix_multiplication.c \
        src/c/operations/matrix_transpose.c \
        src/c/operations/matrix_kronecker.c \
        src/c/operations/operations_tools.c \
-       src/c/operations/matrix_substraction.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 \
@@ -249,13 +249,13 @@ am_libsciast_la_OBJECTS = src/cpp/ast/libsciast_la-runvisitor.lo \
        src/cpp/operations/libsciast_la-types_comparison_ne.lo \
        src/cpp/operations/libsciast_la-types_power.lo \
        src/cpp/operations/libsciast_la-types_divide.lo \
-       src/cpp/operations/libsciast_la-types_substraction.lo \
+       src/cpp/operations/libsciast_la-types_subtraction.lo \
        src/cpp/operations/libsciast_la-types_opposite.lo \
        src/c/operations/libsciast_la-matrix_multiplication.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_substraction.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 \
@@ -706,13 +706,13 @@ libsciast_la_SOURCES = src/cpp/ast/runvisitor.cpp \
        src/cpp/operations/types_comparison_ne.cpp \
        src/cpp/operations/types_power.cpp \
        src/cpp/operations/types_divide.cpp \
-       src/cpp/operations/types_substraction.cpp \
+       src/cpp/operations/types_subtraction.cpp \
        src/cpp/operations/types_opposite.cpp \
        src/c/operations/matrix_multiplication.c \
        src/c/operations/matrix_transpose.c \
        src/c/operations/matrix_kronecker.c \
        src/c/operations/operations_tools.c \
-       src/c/operations/matrix_substraction.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 \
@@ -793,7 +793,7 @@ libsciast_la_etc_DATA = \
 libsciast_scilab_la_includedir = $(pkgincludedir)
 libsciast_scilab_la_include_HEADERS = \
 includes/operations/matrix_power.h \
-includes/operations/types_substraction.hxx \
+includes/operations/types_subtraction.hxx \
 includes/operations/types_addition.hxx \
 includes/operations/types_kronecker.hxx \
 includes/operations/generic_operations.hxx \
@@ -801,7 +801,7 @@ includes/operations/types_divide.hxx \
 includes/operations/types_finite.hxx \
 includes/operations/types_transposition.hxx \
 includes/operations/matrix_addition.h \
-includes/operations/matrix_substraction.h \
+includes/operations/matrix_subtraction.h \
 includes/operations/doublecomplex.h \
 includes/operations/types_comparison_eq.hxx \
 includes/operations/matrix_transpose.h \
@@ -1189,7 +1189,7 @@ src/cpp/operations/libsciast_la-types_power.lo:  \
 src/cpp/operations/libsciast_la-types_divide.lo:  \
        src/cpp/operations/$(am__dirstamp) \
        src/cpp/operations/$(DEPDIR)/$(am__dirstamp)
-src/cpp/operations/libsciast_la-types_substraction.lo:  \
+src/cpp/operations/libsciast_la-types_subtraction.lo:  \
        src/cpp/operations/$(am__dirstamp) \
        src/cpp/operations/$(DEPDIR)/$(am__dirstamp)
 src/cpp/operations/libsciast_la-types_opposite.lo:  \
@@ -1213,7 +1213,7 @@ 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_substraction.lo:  \
+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:  \
@@ -1432,7 +1432,7 @@ 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_substraction.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@
@@ -1457,7 +1457,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/operations/$(DEPDIR)/libsciast_la-types_opposite.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/operations/$(DEPDIR)/libsciast_la-types_or_and.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/operations/$(DEPDIR)/libsciast_la-types_power.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/operations/$(DEPDIR)/libsciast_la-types_substraction.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@src/cpp/operations/$(DEPDIR)/libsciast_la-types_subtraction.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/parse/$(DEPDIR)/libsciast_la-parser.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/parse/$(DEPDIR)/libsciast_la-parsescilab.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@src/cpp/parse/$(DEPDIR)/libsciast_la-printerror.Plo@am__quote@
@@ -1566,12 +1566,12 @@ 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_substraction.lo: src/c/operations/matrix_substraction.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_substraction.lo -MD -MP -MF src/c/operations/$(DEPDIR)/libsciast_la-matrix_substraction.Tpo -c -o src/c/operations/libsciast_la-matrix_substraction.lo `test -f 'src/c/operations/matrix_substraction.c' || echo '$(srcdir)/'`src/c/operations/matrix_substraction.c
-@am__fastdepCC_TRUE@   $(AM_V_at)$(am__mv) src/c/operations/$(DEPDIR)/libsciast_la-matrix_substraction.Tpo src/c/operations/$(DEPDIR)/libsciast_la-matrix_substraction.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@      $(AM_V_CC)source='src/c/operations/matrix_substraction.c' object='src/c/operations/libsciast_la-matrix_substraction.lo' libtool=yes @AMDEPBACKSLASH@
+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_substraction.lo `test -f 'src/c/operations/matrix_substraction.c' || echo '$(srcdir)/'`src/c/operations/matrix_substraction.c
+@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
@@ -1786,12 +1786,12 @@ src/cpp/operations/libsciast_la-types_divide.lo: src/cpp/operations/types_divide
 @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_divide.lo `test -f 'src/cpp/operations/types_divide.cpp' || echo '$(srcdir)/'`src/cpp/operations/types_divide.cpp
 
-src/cpp/operations/libsciast_la-types_substraction.lo: src/cpp/operations/types_substraction.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_substraction.lo -MD -MP -MF src/cpp/operations/$(DEPDIR)/libsciast_la-types_substraction.Tpo -c -o src/cpp/operations/libsciast_la-types_substraction.lo `test -f 'src/cpp/operations/types_substraction.cpp' || echo '$(srcdir)/'`src/cpp/operations/types_substraction.cpp
-@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/operations/$(DEPDIR)/libsciast_la-types_substraction.Tpo src/cpp/operations/$(DEPDIR)/libsciast_la-types_substraction.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/operations/types_substraction.cpp' object='src/cpp/operations/libsciast_la-types_substraction.lo' libtool=yes @AMDEPBACKSLASH@
+src/cpp/operations/libsciast_la-types_subtraction.lo: src/cpp/operations/types_subtraction.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_subtraction.lo -MD -MP -MF src/cpp/operations/$(DEPDIR)/libsciast_la-types_subtraction.Tpo -c -o src/cpp/operations/libsciast_la-types_subtraction.lo `test -f 'src/cpp/operations/types_subtraction.cpp' || echo '$(srcdir)/'`src/cpp/operations/types_subtraction.cpp
+@am__fastdepCXX_TRUE@  $(AM_V_at)$(am__mv) src/cpp/operations/$(DEPDIR)/libsciast_la-types_subtraction.Tpo src/cpp/operations/$(DEPDIR)/libsciast_la-types_subtraction.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@     $(AM_V_CXX)source='src/cpp/operations/types_subtraction.cpp' object='src/cpp/operations/libsciast_la-types_subtraction.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_substraction.lo `test -f 'src/cpp/operations/types_substraction.cpp' || echo '$(srcdir)/'`src/cpp/operations/types_substraction.cpp
+@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_subtraction.lo `test -f 'src/cpp/operations/types_subtraction.cpp' || echo '$(srcdir)/'`src/cpp/operations/types_subtraction.cpp
 
 src/cpp/operations/libsciast_la-types_opposite.lo: src/cpp/operations/types_opposite.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_opposite.lo -MD -MP -MF src/cpp/operations/$(DEPDIR)/libsciast_la-types_opposite.Tpo -c -o src/cpp/operations/libsciast_la-types_opposite.lo `test -f 'src/cpp/operations/types_opposite.cpp' || echo '$(srcdir)/'`src/cpp/operations/types_opposite.cpp
index b8d6bfd..95734e4 100644 (file)
@@ -325,7 +325,7 @@ 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_substraction.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" />
@@ -342,7 +342,7 @@ lib /DEF:"$(ProjectDir)fileio_import.def" /SUBSYSTEM:WINDOWS /MACHINE:$(Platform
     <ClInclude Include="includes\operations\types_opposite.hxx" />
     <ClInclude Include="includes\operations\types_or_and.hxx" />
     <ClInclude Include="includes\operations\types_power.hxx" />
-    <ClInclude Include="includes\operations\types_substraction.hxx" />
+    <ClInclude Include="includes\operations\types_subtraction.hxx" />
     <ClInclude Include="includes\operations\types_transposition.hxx" />
     <ClInclude Include="includes\parse\isatty.hxx" />
     <ClInclude Include="includes\parse\parse.hxx" />
@@ -440,7 +440,7 @@ lib /DEF:"$(ProjectDir)fileio_import.def" /SUBSYSTEM:WINDOWS /MACHINE:$(Platform
     <ClCompile Include="src\cpp\operations\types_opposite.cpp" />
     <ClCompile Include="src\cpp\operations\types_or_and.cpp" />
     <ClCompile Include="src\cpp\operations\types_power.cpp" />
-    <ClCompile Include="src\cpp\operations\types_substraction.cpp" />
+    <ClCompile Include="src\cpp\operations\types_subtraction.cpp" />
     <ClCompile Include="src\cpp\parse\parser.cpp" />
     <ClCompile Include="src\cpp\parse\parsescilab.cpp" />
     <ClCompile Include="src\cpp\parse\printerror.cpp" />
@@ -504,7 +504,7 @@ 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_substraction.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 d32edff..797b203 100644 (file)
     <ClInclude Include="includes\operations\matrix_right_division.h">
       <Filter>Header Files\operations</Filter>
     </ClInclude>
-    <ClInclude Include="includes\operations\matrix_substraction.h">
-      <Filter>Header Files\operations</Filter>
-    </ClInclude>
     <ClInclude Include="includes\operations\matrix_transpose.h">
       <Filter>Header Files\operations</Filter>
     </ClInclude>
     <ClInclude Include="includes\operations\types_power.hxx">
       <Filter>Header Files\operations</Filter>
     </ClInclude>
-    <ClInclude Include="includes\operations\types_substraction.hxx">
-      <Filter>Header Files\operations</Filter>
-    </ClInclude>
     <ClInclude Include="includes\operations\types_transposition.hxx">
       <Filter>Header Files\operations</Filter>
     </ClInclude>
     <ClInclude Include="includes\operations\types_opposite.hxx">
       <Filter>Header Files\operations</Filter>
     </ClInclude>
+    <ClInclude Include="includes\operations\types_subtraction.hxx">
+      <Filter>Header Files\operations</Filter>
+    </ClInclude>
+    <ClInclude Include="includes\operations\matrix_subtraction.h">
+      <Filter>Header Files\operations</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <ClCompile Include="src\cpp\ast\debugvisitor.cpp">
     <ClCompile Include="src\cpp\operations\types_power.cpp">
       <Filter>Source Files\operations</Filter>
     </ClCompile>
-    <ClCompile Include="src\cpp\operations\types_substraction.cpp">
-      <Filter>Source Files\operations</Filter>
-    </ClCompile>
     <ClCompile Include="src\c\operations\doublecomplex.c">
       <Filter>Source Files\operations</Filter>
     </ClCompile>
     <ClCompile Include="src\c\operations\matrix_power.c">
       <Filter>Source Files\operations</Filter>
     </ClCompile>
-    <ClCompile Include="src\c\operations\matrix_substraction.c">
-      <Filter>Source Files\operations</Filter>
-    </ClCompile>
     <ClCompile Include="src\c\operations\matrix_transpose.c">
       <Filter>Source Files\operations</Filter>
     </ClCompile>
     <ClCompile Include="src\cpp\operations\types_opposite.cpp">
       <Filter>Source Files\operations</Filter>
     </ClCompile>
+    <ClCompile Include="src\cpp\operations\types_subtraction.cpp">
+      <Filter>Source Files\operations</Filter>
+    </ClCompile>
+    <ClCompile Include="src\c\operations\matrix_subtraction.c">
+      <Filter>Source Files\operations</Filter>
+    </ClCompile>
   </ItemGroup>
 </Project>
\ No newline at end of file
@@ -10,8 +10,8 @@
 *
 */
 
-#ifndef __MATRIX_SUBSTRACT_H__
-#define __MATRIX_SUBSTRACT_H__
+#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);
@@ -33,4 +33,4 @@ int iSubstractComplexMatrixToRealMatrix(double* _pdblReal1, double* _pdblImg1, d
 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_SUBSTRACT_H__ */
+#endif /* __MATRIX_SUBTRACT_H__ */
index 0f5d834..ab2b480 100644 (file)
@@ -16,6 +16,8 @@
 #include "internal.hxx"
 #include "sparse.hxx"
 #include "polynom.hxx"
+#include "bool.hxx"
+#include "double.hxx"
 
 void fillOppositeFunction();
 
@@ -33,6 +35,9 @@ DECLARE_OPPOSITE_PROTO(opposite_MC);
 
 #undef DECLARE_OPPOSITE_PROTO
 
+//do not inline it
+template<> types::InternalType* opposite_M<types::Bool, types::Double>(types::Bool* _pL);
+
 template<> inline types::InternalType* opposite_M<types::Sparse, types::Sparse>(types::Sparse* _pL);
 template<> inline types::InternalType* opposite_MC<types::Sparse, types::Sparse>(types::Sparse* _pL);
 
diff --git a/scilab/modules/ast/includes/operations/types_substraction.hxx b/scilab/modules/ast/includes/operations/types_substraction.hxx
deleted file mode 100644 (file)
index 68b8663..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
-*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-*  Copyright (C) 2008-2008 - DIGITEO - Antoine ELIAS
-*  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
-*
-*  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_SUB_H__
-#define __TYPES_SUB_H__
-
-#include "generic_operations.hxx"
-#include "double.hxx"
-#include "polynom.hxx"
-#include "sparse.hxx"
-
-void fillSubtractFunction();
-void fillOppositeFunction();
-
-//define arrays on operation functions
-typedef types::InternalType*(*opposite_function)(types::InternalType*);
-
-
-#define DECLARE_OPPOSITE_PROTO(x) template<class T, class O> inline types::InternalType* x(T *_pL)
-DECLARE_OPPOSITE_PROTO(opposite_S);
-DECLARE_OPPOSITE_PROTO(opposite_M);
-
-
-typedef types::InternalType*(*subtract_function)(types::InternalType*, types::InternalType*);
-
-int SubstractDoubleToDouble(types::Double* _pDouble1, types::Double* _pDouble2, types::Double **_pDoubleOut);
-int SubstractPolyToDouble(types::Double *_pDouble, types::Polynom *_pPoly, types::Polynom **_pPolyOut);
-int SubstractDoubleToPoly(types::Polynom *_pPoly, types::Double *_pDouble, types::Polynom **_pPolyOut);
-int SubstractPolyToPoly(types::Polynom *_pPoly1, types::Polynom *_pPoly2, types::Polynom **_pPolyOut);
-
-//Sparse
-int SubstractSparseToSparse(types::Sparse* _pSparse1, types::Sparse* _pSparse2, types::GenericType **_pSparseOut);
-int SubstractSparseToDouble(types::Sparse* _pSparse, types::Double* _pDouble, types::GenericType **_pDoubleOut);
-int SubstractDoubleToSparse(types::Double* _pDouble, types::Sparse* _pSparse, types::GenericType **_pDoubleOut);
-
-#endif /* __TYPES_SUB_H__ */
diff --git a/scilab/modules/ast/includes/operations/types_subtraction.hxx b/scilab/modules/ast/includes/operations/types_subtraction.hxx
new file mode 100644 (file)
index 0000000..51ba48d
--- /dev/null
@@ -0,0 +1,272 @@
+/*
+*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+*  Copyright (C) 2008-2008 - DIGITEO - Antoine ELIAS
+*  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
+*
+*  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_SUB_H__
+#define __TYPES_SUB_H__
+
+#include "generic_operations.hxx"
+#include "double.hxx"
+#include "polynom.hxx"
+#include "sparse.hxx"
+
+// FIXME : remove using namespace
+void fillSubtractFunction();
+
+//define arrays on operation functions
+typedef types::InternalType*(*sub_function)(types::InternalType*, types::InternalType*);
+
+#define DECLARE_SUB_PROTO(x) template<class T, class U, class O> inline types::InternalType* x(T *_pL, U *_pR)
+//Double, int , bool
+DECLARE_SUB_PROTO(sub_M_M);
+DECLARE_SUB_PROTO(sub_M_MC);
+DECLARE_SUB_PROTO(sub_M_S);
+DECLARE_SUB_PROTO(sub_M_SC);
+DECLARE_SUB_PROTO(sub_M_E);
+
+DECLARE_SUB_PROTO(sub_MC_M);
+DECLARE_SUB_PROTO(sub_MC_MC);
+DECLARE_SUB_PROTO(sub_MC_S);
+DECLARE_SUB_PROTO(sub_MC_SC);
+DECLARE_SUB_PROTO(sub_MC_E);
+
+DECLARE_SUB_PROTO(sub_S_M);
+DECLARE_SUB_PROTO(sub_S_MC);
+DECLARE_SUB_PROTO(sub_S_S);
+DECLARE_SUB_PROTO(sub_S_SC);
+DECLARE_SUB_PROTO(sub_S_E);
+
+DECLARE_SUB_PROTO(sub_SC_M);
+DECLARE_SUB_PROTO(sub_SC_MC);
+DECLARE_SUB_PROTO(sub_SC_S);
+DECLARE_SUB_PROTO(sub_SC_SC);
+DECLARE_SUB_PROTO(sub_SC_E);
+
+//[]
+DECLARE_SUB_PROTO(sub_E_M);
+DECLARE_SUB_PROTO(sub_E_MC);
+DECLARE_SUB_PROTO(sub_E_E);
+
+//eye
+DECLARE_SUB_PROTO(sub_I_M);
+DECLARE_SUB_PROTO(sub_I_MC);
+DECLARE_SUB_PROTO(sub_IC_M);
+DECLARE_SUB_PROTO(sub_IC_MC);
+
+DECLARE_SUB_PROTO(sub_I_S);
+DECLARE_SUB_PROTO(sub_I_SC);
+DECLARE_SUB_PROTO(sub_IC_S);
+DECLARE_SUB_PROTO(sub_IC_SC);
+
+DECLARE_SUB_PROTO(sub_M_I);
+DECLARE_SUB_PROTO(sub_MC_I);
+DECLARE_SUB_PROTO(sub_M_IC);
+DECLARE_SUB_PROTO(sub_MC_IC);
+
+DECLARE_SUB_PROTO(sub_S_I);
+DECLARE_SUB_PROTO(sub_SC_I);
+DECLARE_SUB_PROTO(sub_S_IC);
+DECLARE_SUB_PROTO(sub_SC_IC);
+
+DECLARE_SUB_PROTO(sub_I_I);
+DECLARE_SUB_PROTO(sub_I_IC);
+DECLARE_SUB_PROTO(sub_IC_I);
+DECLARE_SUB_PROTO(sub_IC_IC);
+
+DECLARE_SUB_PROTO(sub_I_E);
+DECLARE_SUB_PROTO(sub_IC_E);
+DECLARE_SUB_PROTO(sub_E_I);
+DECLARE_SUB_PROTO(sub_E_IC);
+
+template<> inline types::InternalType* sub_M_M<types::Polynom, types::Polynom, types::Polynom>(types::Polynom* _pL, types::Polynom* _pR);
+template<> inline types::InternalType* sub_M_M<types::Polynom, types::Double, types::Polynom>(types::Polynom* _pL, types::Double* _pR);
+template<> inline types::InternalType* sub_M_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
+template<> inline types::InternalType* sub_I_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
+template<> inline types::InternalType* sub_IC_M<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
+template<> inline types::InternalType* sub_I_MC<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
+template<> inline types::InternalType* sub_IC_MC<types::Double, types::Polynom, types::Polynom>(types::Double* _pL, types::Polynom* _pR);
+
+template<> inline types::InternalType* sub_M_M<types::Sparse, types::Sparse, types::Sparse>(types::Sparse* _pL, types::Sparse* _pR);
+template<> inline types::InternalType* sub_M_M<types::Double, types::Sparse, types::Double>(types::Double* _pL, types::Sparse* _pR);
+template<> inline types::InternalType* sub_M_M<types::Sparse, types::Double, types::Double>(types::Sparse* _pL, types::Double* _pR);
+template<> inline types::InternalType* sub_M_M<types::Double, types::Sparse, types::Sparse>(types::Double* _pL, types::Sparse* _pR);
+template<> inline types::InternalType* sub_M_M<types::Sparse, types::Double, types::Sparse>(types::Sparse* _pL, types::Double* _pR);
+
+//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)
+{
+    for (int 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)
+{
+    for (int i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] - (O)r[i];
+    }
+}
+
+
+//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)
+{
+    for (int i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] - (O)r[i];
+        oc[i] = (O) - rc[i];
+    }
+}
+
+//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)
+{
+    for (int i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] - (O)r[i];
+        oc[i] = (O)lc[i];
+    }
+}
+
+// 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)
+{
+    for (int i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] - (O)r[i];
+        oc[i] = (O)lc[i] - (O)rc[i];
+    }
+}
+
+//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)
+{
+    for (int 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)
+{
+    for (int i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] - (O)r;
+        oc[i] = (O)lc[i];
+    }
+}
+
+//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)
+{
+    for (int i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] - (O) r;
+        oc[i] = (O) - rc;
+    }
+}
+
+//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)
+{
+    for (int i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l[i] - (O)r;
+        oc[i] = (O)lc[i] - (O)rc;
+    }
+}
+
+//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)
+{
+    for (int 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)
+{
+    for (int i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l - (O)r[i];
+        oc[i] = (O) - rc[i];
+    }
+}
+
+//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)
+{
+    for (int i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l - (O)r[i];
+        oc[i] = (O)lc;
+    }
+}
+
+//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)
+{
+    for (int i = 0; i < size ; ++i)
+    {
+        o[i] = (O)l - (O)r[i];
+        oc[i] = (O)lc - rc[i];
+    }
+}
+
+
+//add scalar - scalar ( double, int, bool )
+//same type
+template<typename T, typename O> inline static void sub(T l, T r, O* o)
+{
+    *o = (O)l - (O)r;
+}
+//x1 - x1
+template<typename T, typename U, typename O> inline static void sub(T l, U r, O* o)
+{
+    *o = (O)l - (O)r;
+}
+
+//x1C - x1C
+template<typename T, typename U, typename O> inline static void sub(T l, T lc, U r, U rc, O* o, O* oc)
+{
+    *o = (O)l - (O)r;
+    *oc = (O)lc - (O)rc;
+}
+
+//x1 - []
+template<typename T, typename O> inline static void sub(T l, O* o)
+{
+    *o = (O)l;
+}
+
+//x1c - []
+template<typename T, typename O> inline static void sub(T l, T lc, O* o, O* oc)
+{
+    *o = (O)l;
+    *oc = (O)lc;
+}
+
+//[] - []
+inline static void sub()
+{
+}
+
+#endif /* __TYPES_SUB_H__ */
@@ -11,7 +11,7 @@
 */
 
 #include "core_math.h"
-#include "matrix_substraction.h"
+#include "matrix_subtraction.h"
 #include "operations_tools.h"
 #include "string.h"
 
index fb06eeb..95f3060 100644 (file)
@@ -3,10 +3,12 @@
 
 #include "operations.hxx"
 #include "types_addition.hxx"
+#include "types_subtraction.hxx"
 #include "types_opposite.hxx"
 
 void initOperationArray()
 {
     fillAddFunction();
     fillOppositeFunction();
+    fillSubtractFunction();
 }
index 6c32ad5..831eef4 100644 (file)
@@ -15,6 +15,7 @@
 #include "polynom.hxx"
 #include "int.hxx"
 #include "sparse.hxx"
+#include "bool.hxx"
 #include "generic_operations.hxx"
 
 using namespace types;
@@ -35,6 +36,7 @@ void fillOppositeFunction()
     //Scalar
     scilab_fill_opposite(ScalarDouble, S, Double, Double);
     scilab_fill_opposite(ScalarDoubleComplex, SC, Double, Double);
+    scilab_fill_opposite(ScalarBool, S, Bool, Bool);
     scilab_fill_opposite(ScalarInt8, S, Int8, Int8);
     scilab_fill_opposite(ScalarUInt8, S, UInt8, UInt8);
     scilab_fill_opposite(ScalarInt16, S, Int16, Int16);
@@ -49,6 +51,7 @@ void fillOppositeFunction()
     //Matrix
     scilab_fill_opposite(Double, M, Double, Double);
     scilab_fill_opposite(DoubleComplex, MC, Double, Double);
+    scilab_fill_opposite(Bool, M, Bool, Bool);
     scilab_fill_opposite(Int8, M, Int8, Int8);
     scilab_fill_opposite(UInt8, M, UInt8, UInt8);
     scilab_fill_opposite(Int16, M, Int16, Int16);
@@ -158,6 +161,23 @@ types::InternalType* opposite_MC(T *_pL)
     return pOut;
 }
 
+//Boolean
+template<>
+types::InternalType* opposite_M<types::Bool, types::Double>(types::Bool* _pL)
+{
+    Double* pOut = new Double(_pL->getDims(), _pL->getDimsArray());
+    int iSize = _pL->getSize();
+
+    int* pI = _pL->get();
+    double* pD = pOut->get();
+    for (int i = 0 ; i < iSize ; ++i)
+    {
+        pD[i] = pI[i] == 0 ? 1 : 0;
+    }
+
+    return pOut;
+}
+
 //Sparse
 template<>
 types::InternalType* opposite_M<types::Sparse, types::Sparse>(types::Sparse *_pL)
diff --git a/scilab/modules/ast/src/cpp/operations/types_substraction.cpp b/scilab/modules/ast/src/cpp/operations/types_substraction.cpp
deleted file mode 100644 (file)
index 20c8dd8..0000000
+++ /dev/null
@@ -1,1260 +0,0 @@
-/*
-*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-*  Copyright (C) 2008-2008 - DIGITEO - Antoine ELIAS
-*  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
-*
-*  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 <stdio.h>
-
-#include "types_substraction.hxx"
-#include "double.hxx"
-#include "polynom.hxx"
-#include "int.hxx"
-#include "sparse.hxx"
-#include "generic_operations.hxx"
-
-extern "C"
-{
-#include "matrix_substraction.h"
-#include "elem_common.h" //dset
-}
-
-using namespace types;
-
-//define arrays on operation functions
-static subtract_function pSubtractfunction[types::InternalType::IdLast][types::InternalType::IdLast] = {NULL};
-
-void fillSubtractFunction()
-{
-#define scilab_fill_subtract(id1, id2, func, typeIn1, typeIn2, typeOut) \
-    pSubtractfunction[types::InternalType::Id ## id1][types::InternalType::Id ## id2] = (subtract_function)&subtract_##func<typeIn1, typeIn2, typeOut>
-}
-
-InternalType* GenericMinus(InternalType* _pLeftOperand, InternalType* _pRightOperand)
-{
-    InternalType *pResult = NULL;
-
-    // InternalType - [] and [] - []
-    if (_pRightOperand->isDouble() && _pRightOperand->getAs<Double>()->isEmpty())
-    {
-        return _pLeftOperand->clone();
-    }
-
-    // [] - InternalType
-    if (_pLeftOperand->isDouble() && _pLeftOperand->getAs<Double>()->isEmpty())
-    {
-        if (_pRightOperand->isSparse())
-        {
-            InternalType* pSpOut = NULL;
-            Sparse* pSp = new Sparse(1, 1);
-            pSp->set(0, 0, -1.0);
-            pSpOut = GenericTimes((InternalType*)pSp, _pRightOperand);
-            delete pSp;
-            return pSpOut;
-        }
-
-        Double pDblZero = Double(0);
-        return GenericMinus((InternalType*)&pDblZero, _pRightOperand);
-    }
-
-    /*
-    ** DOUBLE - DOUBLE
-    */
-    if (_pLeftOperand->isDouble() && _pRightOperand->isDouble())
-    {
-        Double *pL = _pLeftOperand->getAs<Double>();
-        Double *pR = _pRightOperand->getAs<Double>();
-
-        int iResult = SubstractDoubleToDouble(pL, pR, (Double**)&pResult);
-        if (iResult != 0)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-        return pResult;
-    }
-
-    /*
-    ** DOUBLE - POLY
-    */
-    else if (_pLeftOperand->isDouble() && _pRightOperand->isPoly())
-    {
-        Double *pL              = _pLeftOperand->getAs<Double>();
-        Polynom *pR          = _pRightOperand->getAs<types::Polynom>();
-
-        int iResult = SubstractPolyToDouble(pL, pR, (Polynom**)&pResult);
-        if (iResult != 0)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-        return pResult;
-    }
-
-    /*
-    ** POLY - DOUBLE
-    */
-    else if (_pLeftOperand->isPoly() && _pRightOperand->isDouble())
-    {
-        Polynom *pL   = _pLeftOperand->getAs<types::Polynom>();
-        Double *pR    = _pRightOperand->getAs<Double>();
-
-        int iResult = SubstractDoubleToPoly(pL, pR, (Polynom**)&pResult);
-        if (iResult != 0)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-        return pResult;
-    }
-
-    /*
-    ** POLY - POLY
-    */
-    else if (_pLeftOperand->isPoly() && _pRightOperand->isPoly())
-    {
-        Polynom *pL   = _pLeftOperand->getAs<types::Polynom>();
-        Polynom *pR   = _pRightOperand->getAs<types::Polynom>();
-
-        int iResult = SubstractPolyToPoly(pL, pR, (Polynom**)&pResult);
-        if (iResult != 0)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-        return pResult;
-    }
-
-    /*
-    ** SPARSE - SPARSE
-    */
-    else if (_pLeftOperand->isSparse() && _pRightOperand->isSparse())
-    {
-        Sparse *pL = _pLeftOperand->getAs<Sparse>();
-        Sparse *pR = _pRightOperand->getAs<Sparse>();
-
-        int iResult = SubstractSparseToSparse(pR, pL, (GenericType**)&pResult);
-        if (iResult != 0)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-
-        return pResult;
-    }
-
-    /*
-    ** SPARSE - DOUBLE
-    */
-    else if (_pLeftOperand->isSparse() && _pRightOperand->isDouble())
-    {
-        Sparse *pL = _pLeftOperand->getAs<Sparse>();
-        Double *pR = _pRightOperand->getAs<Double>();
-
-        int iResult = SubstractDoubleToSparse(pR, pL, (GenericType**)&pResult);
-        if (iResult != 0)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-
-        return pResult;
-    }
-
-    /*
-    ** DOUBLE - SPARSE
-    */
-    else if (_pLeftOperand->isDouble() && _pRightOperand->isSparse())
-    {
-        Double *pL = _pLeftOperand->getAs<Double>();
-        Sparse *pR = _pRightOperand->getAs<Sparse>();
-
-        int iResult = SubstractSparseToDouble(pR, pL, (GenericType**)&pResult);
-        if (iResult != 0)
-        {
-            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
-        }
-
-        return pResult;
-    }
-    /*
-    ** Default case : Return NULL will Call Overloading.
-    */
-    return NULL;
-}
-
-int SubstractDoubleToDouble(Double* _pDouble1, Double* _pDouble2, Double** _pDoubleOut)
-{
-    bool bComplex1  = _pDouble1->isComplex();
-    bool bComplex2  = _pDouble2->isComplex();
-
-    if (_pDouble1->isIdentity())
-    {
-        if (_pDouble2->getDims() > 2)
-        {
-            //unable to substract identity matrix and greater than 2 dimensions matrix
-            return 1;
-        }
-
-        (*_pDoubleOut) = new Double(_pDouble2->getRows(), _pDouble2->getCols(), bComplex1 || bComplex2);
-
-        if (bComplex1 == false && bComplex2 == false)
-        {
-            iSubstractRealIdentityToRealMatrix(
-                _pDouble1->get(0),
-                _pDouble2->get(), _pDouble2->getRows(), _pDouble2->getCols(),
-                (*_pDoubleOut)->get());
-        }
-        else if (bComplex1 == false && bComplex2 == true)
-        {
-            iSubstractRealIdentityToComplexMatrix(
-                _pDouble1->get(0),
-                _pDouble2->get(), _pDouble2->getImg(), _pDouble2->getRows(), _pDouble2->getCols(),
-                (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-        }
-        else if (bComplex1 == true && bComplex2 == false)
-        {
-            iSubstractComplexIdentityToRealMatrix(
-                _pDouble1->get(0), _pDouble1->getImg(0),
-                _pDouble2->get(), _pDouble2->getRows(), _pDouble2->getCols(),
-                (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-        }
-        else if (bComplex1 == true && bComplex2 == true)
-        {
-            iSubstractComplexIdentityToComplexMatrix(
-                _pDouble1->get(0), _pDouble1->getImg(0),
-                _pDouble2->get(), _pDouble2->getImg(), _pDouble2->getRows(), _pDouble2->getCols(),
-                (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-        }
-
-        //return opposite
-        double* pDbl = (*_pDoubleOut)->get();
-        if ((*_pDoubleOut)->isComplex())
-        {
-            double* pDblImg = (*_pDoubleOut)->getImg();
-            for (int i = 0 ; i < _pDouble2->getSize() ; i++)
-            {
-                pDbl[i] = -pDbl[i];
-                pDblImg[i] = -pDblImg[i];
-            }
-        }
-        else
-        {
-            for (int i = 0 ; i < _pDouble2->getSize() ; i++)
-            {
-                pDbl[i] = -pDbl[i];
-            }
-        }
-        return 0;
-    }
-
-    if (_pDouble2->isIdentity())
-    {
-        if (_pDouble1->getDims() > 2)
-        {
-            //unable to substract identity matrix and greater than 2 dimensions matrix
-            return 1;
-        }
-
-        (*_pDoubleOut) = new Double(_pDouble1->getRows(), _pDouble1->getCols(), bComplex1 || bComplex2);
-        if (bComplex1 == false && bComplex2 == false)
-        {
-            iSubstractRealIdentityToRealMatrix(
-                _pDouble2->get(0),
-                _pDouble1->get(), _pDouble1->getRows(), _pDouble1->getCols(),
-                (*_pDoubleOut)->get());
-        }
-        else if (bComplex1 == false && bComplex2 == true)
-        {
-            iSubstractComplexIdentityToRealMatrix(
-                _pDouble2->get(0), _pDouble2->getImg(0),
-                _pDouble1->get(), _pDouble1->getRows(), _pDouble1->getCols(),
-                (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-        }
-        else if (bComplex1 == true && bComplex2 == false)
-        {
-            iSubstractRealIdentityToComplexMatrix(
-                _pDouble2->get(0),
-                _pDouble1->get(), _pDouble1->getImg(), _pDouble1->getRows(), _pDouble1->getCols(),
-                (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-        }
-        else if (bComplex1 == true && bComplex2 == true)
-        {
-            iSubstractComplexIdentityToComplexMatrix(
-                _pDouble2->get(0), _pDouble2->getImg(0),
-                _pDouble1->get(), _pDouble1->getImg(), _pDouble1->getRows(), _pDouble1->getCols(),
-                (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-        }
-
-        return 0;
-    }
-
-    if (_pDouble1->isScalar())
-    {
-        //add pL with each element of pR
-        (*_pDoubleOut) = new Double(_pDouble2->getDims(), _pDouble2->getDimsArray(), bComplex1 || bComplex2);
-        if (bComplex1 == false && bComplex2 == false)
-        {
-            iSubstractRealMatrixToRealScalar(
-                _pDouble2->get(), _pDouble2->getDimsArray(), _pDouble2->getDims(),
-                _pDouble1->get(0),
-                (*_pDoubleOut)->get());
-        }
-        else if (bComplex1 == false && bComplex2 == true)
-        {
-            iSubstractComplexMatrixToRealScalar(
-                _pDouble2->get(), _pDouble2->getImg(), _pDouble2->getDimsArray(), _pDouble2->getDims(),
-                _pDouble1->get(0),
-                (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-        }
-        else if (bComplex1 == true && bComplex2 == false)
-        {
-            iSubstractRealMatrixToComplexScalar(
-                _pDouble2->get(), _pDouble2->getDimsArray(), _pDouble2->getDims(),
-                _pDouble1->get(0), _pDouble1->getImg(0),
-                (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-        }
-        else if (bComplex1 == true && bComplex2 == true)
-        {
-            iSubstractComplexMatrixToComplexScalar(
-                _pDouble2->get(), _pDouble2->getImg(), _pDouble2->getDimsArray(), _pDouble2->getDims(),
-                _pDouble1->get(0), _pDouble1->getImg(0),
-                (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-        }
-
-        return 0;
-    }
-
-    if (_pDouble2->isScalar())
-    {
-        //add pL with each element of pR
-        (*_pDoubleOut) = new Double(_pDouble1->getDims(), _pDouble1->getDimsArray(), bComplex1 || bComplex2);
-        if (bComplex1 == false && bComplex2 == false)
-        {
-            iSubstractRealScalarToRealMatrix(
-                _pDouble2->get(0),
-                _pDouble1->get(), _pDouble1->getDimsArray(), _pDouble1->getDims(),
-                (*_pDoubleOut)->get());
-        }
-        else if (bComplex1 == false && bComplex2 == true)
-        {
-            iSubstractComplexScalarToRealMatrix(
-                _pDouble2->get(0), _pDouble2->getImg(0),
-                _pDouble1->get(), _pDouble1->getDimsArray(), _pDouble1->getDims(),
-                (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-        }
-        else if (bComplex1 == true && bComplex2 == false)
-        {
-            iSubstractRealScalarToComplexMatrix(
-                _pDouble2->get(0),
-                _pDouble1->get(), _pDouble1->getImg(), _pDouble1->getDimsArray(), _pDouble1->getDims(),
-                (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-        }
-        else if (bComplex1 == true && bComplex2 == true)
-        {
-            iSubstractComplexScalarToComplexMatrix(
-                _pDouble2->get(0), _pDouble2->getImg(0),
-                _pDouble1->get(), _pDouble1->getImg(), _pDouble1->getDimsArray(), _pDouble1->getDims(),
-                (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-        }
-
-        return 0;
-    }
-
-
-    //add pL and pR element wise
-
-    int iDims1 = _pDouble1->getDims();
-    int iDims2 = _pDouble2->getDims();
-
-    if (iDims1 != iDims2)
-    {
-        return 1;
-    }
-
-    int* piDims1    = _pDouble1->getDimsArray();
-    int* piDims2    = _pDouble2->getDimsArray();
-    for (int i = 0 ; i < _pDouble1->getDims() ; i++)
-    {
-        if (piDims1[i] != piDims2[i])
-        {
-            return 1;
-        }
-    }
-
-    (*_pDoubleOut) = new Double(iDims2, piDims2, bComplex1 || bComplex2);
-    if (bComplex1 == false && bComplex2 == false)
-    {
-        iSubstractRealMatrixToRealMatrix(
-            _pDouble2->get(),
-            _pDouble1->get(), piDims1, iDims1,
-            (*_pDoubleOut)->get());
-    }
-    else if (bComplex1 == false && bComplex2 == true)
-    {
-        iSubstractComplexMatrixToRealMatrix(
-            _pDouble2->get(), _pDouble2->getImg(),
-            _pDouble1->get(), piDims1, iDims1,
-            (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-    }
-    else if (bComplex1 == true && bComplex2 == false)
-    {
-        iSubstractRealMatrixToComplexMatrix(
-            _pDouble2->get(),
-            _pDouble1->get(), _pDouble1->getImg(), piDims1, iDims1,
-            (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-    }
-    else if (bComplex1 == true && bComplex2 == true)
-    {
-        iSubstractComplexMatrixToComplexMatrix(
-            _pDouble2->get(), _pDouble2->getImg(),
-            _pDouble1->get(), _pDouble1->getImg(), piDims1, iDims1,
-            (*_pDoubleOut)->get(), (*_pDoubleOut)->getImg());
-    }
-
-    return 0;
-}
-
-//1 - %s
-int SubstractPolyToDouble(Double *_pDouble, Polynom *_pPoly, Polynom** _pPolyOut)
-{
-    double *pInDblR = _pDouble->get();
-    double *pInDblI = _pDouble->getImg();
-
-    if (_pDouble->isScalar())
-    {
-        //Clone original poly
-        (*_pPolyOut) = _pPoly->clone()->getAs<Polynom>();
-
-        if (_pDouble->isComplex())
-        {
-            (*_pPolyOut)->setComplex(true);
-        }
-
-        for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-        {
-            SinglePoly *pOutPoly    = (*_pPolyOut)->get(i);
-            double *pOutPolyR       = pOutPoly->get();
-
-            pOutPolyR[0] = pInDblR[0] - pOutPolyR[0];
-
-            for (int j = 1 ; j < pOutPoly->getSize() ; j++)
-            {
-                pOutPolyR[j] = - pOutPolyR[j];
-            }
-        }
-
-        if ((*_pPolyOut)->isComplex())
-        {
-            for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-            {
-                SinglePoly *pOutPoly    = (*_pPolyOut)->get(i);
-                double *pOutPolyI       = pOutPoly->getImg();
-
-                pOutPolyI[0]            = (pInDblI == NULL ? 0 : pInDblI[0]) - (pOutPolyI == NULL ? 0 : pOutPolyI[0]);
-
-                for (int j = 1 ; j < pOutPoly->getSize() ; j++)
-                {
-                    pOutPolyI[j] = - pOutPolyI[j];
-                }
-            }
-        }
-
-        return 0;
-    }
-
-    if (_pPoly->isScalar())
-    {
-        //[] - %s
-        int *piRank = new int[_pDouble->getSize()];
-        for (int i = 0 ; i < _pDouble->getSize() ; i++)
-        {
-            piRank[i] = _pPoly->get(0)->getRank();
-        }
-
-        (*_pPolyOut) = new Polynom(_pPoly->getVariableName(), _pDouble->getDims(), _pDouble->getDimsArray(), piRank);
-
-        for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-        {
-            SinglePoly *pInPoly   = _pPoly->get(0);
-            SinglePoly *pOutPoly  = (*_pPolyOut)->get(i);
-
-            double *pInPolyR = pInPoly->get();
-            double *pOutPolyR = pOutPoly->get();
-
-            pOutPolyR[0] = pInDblR[i] - pInPolyR[0];
-
-            for (int j = 1 ; j < pOutPoly->getSize() ; j++)
-            {
-                pOutPolyR[j] = - pInPolyR[j];
-            }
-        }
-
-        if (_pPoly->isComplex() || _pDouble->isComplex())
-        {
-            (*_pPolyOut)->setComplex(true);
-            for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-            {
-                SinglePoly *pInPoly   = _pPoly->get(0);
-                SinglePoly *pOutPoly  = (*_pPolyOut)->get(i);
-
-                double *pInPolyI = pInPoly->getImg();
-                double *pOutPolyI = pOutPoly->getImg();
-
-                pOutPolyI[0] = (pInDblI != NULL ? pInDblI[i] : 0) - (pInPolyI != NULL ? pInPolyI[0] : 0);
-
-                for (int j = 1 ; j < pOutPoly->getSize() ; j++)
-                {
-                    pOutPolyI[j] = -pInPolyI[j];
-                }
-            }
-        }
-
-        return 0;
-    }
-
-    //check dimension compatibilities
-    int iLeftDims = _pDouble->getDims();
-    int iRightDims = _pPoly->getDims();
-
-    if (iLeftDims != iRightDims)
-    {
-        return 1;
-    }
-
-    int* piLeftDims = _pDouble->getDimsArray();
-    int* piRightDims = _pPoly->getDimsArray();
-
-    for (int i = 0 ; i < iLeftDims ; i++)
-    {
-        if (piLeftDims[i] != piRightDims[i])
-        {
-            return 1;
-        }
-    }
-
-
-    //Clone original poly
-    (*_pPolyOut) = _pPoly->clone()->getAs<Polynom>();
-
-    for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-    {
-        SinglePoly *pOutPoly    = (*_pPolyOut)->get(i);
-        double *pOutPolyR       = pOutPoly->get();
-
-        pOutPolyR[0] = pInDblR[i] - pOutPolyR[0];
-
-        for (int j = 1 ; j < pOutPoly->getSize() ; j++)
-        {
-            pOutPolyR[j] = - pOutPolyR[j];
-        }
-    }
-
-    if (_pPoly->isComplex() || _pDouble->isComplex())
-    {
-        (*_pPolyOut)->setComplex(true);
-        for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-        {
-            SinglePoly *pOutPoly  = (*_pPolyOut)->get(i);
-            double *pOutPolyI = pOutPoly->getImg();
-
-            pOutPolyI[0] = (pInDblI != NULL ? pInDblI[i] : 0) - (pOutPolyI != NULL ? pOutPolyI[0] : 0);
-
-            for (int j = 1 ; j < pOutPoly->getSize() ; j++)
-            {
-                pOutPolyI[j] = - pOutPolyI[j];
-            }
-        }
-    }
-
-    return 0;
-}
-
-//%s - 1
-int SubstractDoubleToPoly(Polynom *_pPoly, Double *_pDouble, Polynom **_pPolyOut)
-{
-    double *pInDblR   = _pDouble->get();
-    double *pInDblI   = _pDouble->getImg();
-
-    if (_pDouble->isScalar())
-    {
-        //Clone original poly
-        (*_pPolyOut) = _pPoly->clone()->getAs<Polynom>();
-        for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-        {
-            SinglePoly *pOutPoly    = (*_pPolyOut)->get(i);
-            double *pOutPolyR       = pOutPoly->get();
-            pOutPolyR[0]   -= pInDblR[0];
-        }
-
-        if ((*_pPolyOut)->isComplex() || _pDouble->isComplex())
-        {
-            (*_pPolyOut)->setComplex(true);
-            for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-            {
-                SinglePoly *pOutPoly    = (*_pPolyOut)->get(i);
-                double *pOutPolyI       = pOutPoly->getImg();
-
-                pOutPolyI[0]            -=  (pInDblI == NULL ? 0 : pInDblI[0]);
-            }
-        }
-    }
-    else if (_pPoly->isScalar())
-    {
-        int *piRank = new int[_pDouble->getSize()];
-        for (int i = 0 ; i < _pDouble->getSize() ; i++)
-        {
-            piRank[i] = _pPoly->get(0)->getRank();
-        }
-
-        (*_pPolyOut) = new Polynom(_pPoly->getVariableName(), _pDouble->getDims(), _pDouble->getDimsArray(), piRank);
-        (*_pPolyOut)->setComplex(_pPoly->isComplex() || _pDouble->isComplex());
-
-        if (_pPoly->isComplex())
-        {
-            SinglePoly *pInPoly = _pPoly->get(0);
-            double *pInPolyR    = pInPoly->get();
-            double *pInPolyI    = pInPoly->getImg();
-            for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-            {
-                SinglePoly *pOutPoly    = (*_pPolyOut)->get(i);
-                double *pOutPolyR       = pOutPoly->get();
-                double *pOutPolyI       = pOutPoly->getImg();
-
-                pOutPolyR[0]            = pInPolyR[0] - pInDblR[i];
-                pOutPolyI[0]            = pInPolyI[0];
-                for (int j = 1 ; j < pOutPoly->getSize() ; j++)
-                {
-                    pOutPolyR[j]        = pInPolyR[j];
-                    pOutPolyI[j]        = pInPolyI[j];
-                }
-            }
-        }
-        else if (_pDouble->isComplex())
-        {
-            SinglePoly *pInPoly = _pPoly->get(0);
-            double *pInPolyR    = pInPoly->get();
-            for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-            {
-                SinglePoly *pOutPoly    = (*_pPolyOut)->get(i);
-                double *pOutPolyR       = pOutPoly->get();
-                double *pOutPolyI       = pOutPoly->getImg();
-
-                pOutPolyR[0]            = pInPolyR[0] - pInDblR[i];
-                pOutPolyI[0]            = - pInDblI[i];
-                for (int j = 1 ; j < pOutPoly->getSize() ; j++)
-                {
-                    pOutPolyR[j]        = pInPolyR[j];
-                    pOutPolyI[j]        = 0;
-                }
-            }
-        }
-        else
-        {
-            SinglePoly *pInPoly = _pPoly->get(0);
-            double *pInPolyR    = pInPoly->get();
-            for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-            {
-                SinglePoly *pOutPoly    = (*_pPolyOut)->get(i);
-                double *pOutPolyR       = pOutPoly->get();
-
-                pOutPolyR[0]            = pInPolyR[0] - pInDblR[i];
-                for (int j = 1 ; j < pOutPoly->getSize() ; j++)
-                {
-                    pOutPolyR[j]        = pInPolyR[j];
-                }
-            }
-        }
-
-        delete[] piRank;
-    }
-    else
-    {
-        //check dimension compatibilities
-        int iLeftDims = _pDouble->getDims();
-        int iRightDims = _pPoly->getDims();
-
-        if (iLeftDims != iRightDims)
-        {
-            return 1;
-        }
-
-        int* piLeftDims = _pDouble->getDimsArray();
-        int* piRightDims = _pPoly->getDimsArray();
-
-        for (int i = 0 ; i < iLeftDims ; i++)
-        {
-            if (piLeftDims[i] != piRightDims[i])
-            {
-                return 1;
-            }
-        }
-
-        //Clone original poly
-        (*_pPolyOut) = _pPoly->clone()->getAs<Polynom>();
-        for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-        {
-            SinglePoly *pOutPoly    = (*_pPolyOut)->get(i);
-            double *pOutPolyR       = pOutPoly->get();
-            pOutPolyR[0]            -= pInDblR[i];
-        }
-
-        if (_pPoly->isComplex() || _pDouble->isComplex())
-        {
-            (*_pPolyOut)->setComplex(true);
-            for (int i = 0 ; i < (*_pPolyOut)->getSize() ; i++)
-            {
-                SinglePoly *pOutPoly    = (*_pPolyOut)->get(i);
-                double *pOutPolyI       = pOutPoly->getImg();
-
-                pOutPolyI[0]            -= (pInDblI != NULL ? pInDblI[i] : 0);
-            }
-        }
-    }
-    return 0;
-}
-
-int SubstractPolyToPoly(Polynom *_pPoly1, Polynom *_pPoly2, Polynom **_pPolyOut)
-{
-    if (_pPoly1->isScalar())
-    {
-        SinglePoly* p1Coef  = _pPoly1->get(0);
-        int iRank1          = p1Coef->getRank();
-        int* pRank2         = new int[_pPoly2->getSize()];
-        int* pRankOut       = new int[_pPoly2->getSize()];
-
-        _pPoly2->getRank(pRank2);
-        for (int i = 0 ; i < _pPoly2->getSize() ; i++)
-        {
-            pRankOut[i] = std::max(iRank1, pRank2[i]);
-        }
-
-        (*_pPolyOut) = new Polynom(_pPoly2->getVariableName(), _pPoly2->getDims(), _pPoly2->getDimsArray(), pRankOut);
-        (*_pPolyOut)->setComplex(_pPoly1->isComplex() || _pPoly2->isComplex());
-
-        //Result P1(0) + P2(i)
-        double* p1R = p1Coef->get();
-        if ((*_pPolyOut)->isComplex())
-        {
-            double* p1I = p1Coef->getImg();
-            for (int i = 0 ; i < _pPoly2->getSize() ; i++)
-            {
-                SinglePoly* p2Coef   = _pPoly2->get(i);
-                double* p2R          = p2Coef->get();
-                double* p2I          = p2Coef->getImg();
-
-                SinglePoly* pOutCoef = (*_pPolyOut)->get(i);
-                double* pOutR        = pOutCoef->get();
-                double* pOutI        = pOutCoef->getImg();
-
-                for (int j = 0 ; j < pRankOut[i] + 1 ; j++)
-                {
-                    if (j > iRank1)
-                    {
-                        pOutR[j] = - p2R[j];
-                        pOutI[j] = - (p2I ? p2I[j] : 0);
-                    }
-                    else if (j > pRank2[i])
-                    {
-                        pOutR[j] = p1R[j];
-                        pOutI[j] = (p1I ? p1I[j] : 0);
-                    }
-                    else
-                    {
-                        pOutR[j] = p1R[j] - p2R[j];
-                        pOutI[j] = (p1I ? p1I[j] : 0) - (p2I ? p2I[j] : 0);
-                    }
-                }
-            }
-        }
-        else
-        {
-            for (int i = 0 ; i < _pPoly2->getSize() ; i++)
-            {
-                SinglePoly* p2Coef   = _pPoly2->get(i);
-                double* p2R          = p2Coef->get();
-
-                SinglePoly* pOutCoef = (*_pPolyOut)->get(i);
-                double* pOutR        = pOutCoef->get();
-
-                for (int j = 0 ; j < pRankOut[i] + 1 ; j++)
-                {
-                    if (j > iRank1)
-                    {
-                        pOutR[j] = - p2R[j];
-                    }
-                    else if (j > pRank2[i])
-                    {
-                        pOutR[j] = p1R[j];
-                    }
-                    else
-                    {
-                        pOutR[j] = p1R[j] - p2R[j];
-                    }
-                }
-            }
-        }
-
-        delete[] pRankOut;
-        delete[] pRank2;
-        (*_pPolyOut)->updateRank();
-        return 0;
-    }
-
-    if (_pPoly2->isScalar())
-    {
-        //size(p2) == 1
-        int *pRank1     = new int[_pPoly1->getSize()];
-        int iRank2      = _pPoly2->get(0)->getRank();
-        int *pRankOut   = new int[_pPoly1->getSize()];
-
-        _pPoly1->getRank(pRank1);
-        for (int i = 0 ; i < _pPoly1->getSize() ; i++)
-        {
-            pRankOut[i] = std::max(pRank1[i], iRank2);
-        }
-
-        (*_pPolyOut) = new Polynom(_pPoly1->getVariableName(), _pPoly1->getDims(), _pPoly1->getDimsArray(), pRankOut);
-        (*_pPolyOut)->setComplex(_pPoly1->isComplex() || _pPoly2->isComplex());
-
-        //Result P1(i) + P2(0)
-        SinglePoly *p2Coef          = _pPoly2->get(0);
-        double *p2R                 = p2Coef->get();
-
-        if ((*_pPolyOut)->isComplex())
-        {
-            double *p2I                 = p2Coef->getImg();
-            for (int i = 0 ; i < _pPoly1->getSize() ; i++)
-            {
-                SinglePoly *p1Coef      = _pPoly1->get(i);
-                double *p1R             = p1Coef->get();
-                double *p1I             = p1Coef->getImg();
-
-                SinglePoly *pOutCoef    = (*_pPolyOut)->get(i);
-                double *pOutR           = pOutCoef->get();
-                double *pOutI           = pOutCoef->getImg();
-
-                for (int j = 0 ; j < pRankOut[i] + 1 ; j++)
-                {
-                    if (j > pRank1[j])
-                    {
-                        pOutR[j] = - p2R[j];
-                        pOutI[j] = - (p2I ? p2I[j] : 0);
-                    }
-                    else if (j > iRank2)
-                    {
-                        pOutR[j] = p1R[j];
-                        pOutI[j] = (p1I ? p1I[j] : 0);
-                    }
-                    else
-                    {
-                        pOutR[j] = p1R[j] - p2R[j];
-                        pOutI[j] = (p1I ? p1I[j] : 0) - (p2I ? p2I[j] : 0);
-                    }
-                }
-            }
-        }
-        else
-        {
-            for (int i = 0 ; i < _pPoly1->getSize() ; i++)
-            {
-                SinglePoly *p1Coef      = _pPoly1->get(i);
-                double *p1R             = p1Coef->get();
-
-                SinglePoly *pOutCoef    = (*_pPolyOut)->get(i);
-                double *pOutR           = pOutCoef->get();
-
-                for (int j = 0 ; j < pRankOut[i] + 1 ; j++)
-                {
-                    if (j > pRank1[j])
-                    {
-                        pOutR[j] = - p2R[j];
-                    }
-                    else if (j > iRank2)
-                    {
-                        pOutR[j] = p1R[j];
-                    }
-                    else
-                    {
-                        pOutR[j] = p1R[j] - p2R[j];
-                    }
-                }
-            }
-        }
-
-        delete[] pRankOut;
-        delete[] pRank1;
-        (*_pPolyOut)->updateRank();
-        return 0;
-    }
-
-    //check dimension compatibilities
-    int iDims1  = _pPoly1->getDims();
-    int iDims2  = _pPoly2->getDims();
-
-    if (iDims1 != iDims2)
-    {
-        return 1;
-    }
-
-    int* piDims1    = _pPoly1->getDimsArray();
-    int* piDims2    = _pPoly2->getDimsArray();
-
-    for (int i = 0 ; i < iDims1 ; i++)
-    {
-        if (piDims1[i] != piDims2[i])
-        {
-            return 1;
-        }
-    }
-
-    int *pRankOut   = new int[_pPoly1->getSize()];
-    int *pRank1     = new int[_pPoly1->getSize()];
-    int *pRank2     = new int[_pPoly2->getSize()];
-
-    _pPoly1->getRank(pRank1);
-    _pPoly2->getRank(pRank2);
-    for (int i = 0 ; i < _pPoly1->getSize() ; i++)
-    {
-        pRankOut[i] = std::max(pRank1[i], pRank2[i]);
-    }
-
-    (*_pPolyOut) = new Polynom(_pPoly2->getVariableName(), iDims1, piDims1, pRankOut);
-    (*_pPolyOut)->setComplex(_pPoly1->isComplex() || _pPoly2->isComplex());
-
-    //Result P1(i) + P2(i)
-    for (int i = 0 ; i < _pPoly1->getSize() ; i++)
-    {
-        double *p1R     = _pPoly1->get(i)->get();
-        double *p2R     = _pPoly2->get(i)->get();
-        double *pOutR   = (*_pPolyOut)->get(i)->get();
-        int iMin        = std::min(pRank1[i], pRank2[i]);
-        int iMax        = std::max(pRank1[i], pRank2[i]);
-
-        for (int j = 0 ; j < iMin + 1 ; j++)
-        {
-            pOutR[j]    = p1R[j] - p2R[j];
-        }
-
-        double *pTemp   = NULL;
-        int iCoef       = 1;
-        if (pRank1[i] > pRank2[i])
-        {
-            pTemp       = p1R;
-            iCoef       = 1;
-        }
-        else
-        {
-            pTemp       = p2R;
-            iCoef       = -1;
-        }
-
-        for (int j = iMin + 1 ; j < iMax + 1 ; j++)
-        {
-            pOutR[j]    = pTemp[j] * iCoef;
-        }
-
-        if ((*_pPolyOut)->isComplex())
-        {
-            double *p1I     = _pPoly1->get(i)->getImg();
-            double *p2I     = _pPoly2->get(i)->getImg();
-            double *pOutI   = (*_pPolyOut)->get(i)->getImg();
-
-            for (int j = 0 ; j < iMin + 1 ; j++)
-            {
-                pOutI[j]    = (p1I == NULL ? 0 : p1I[j]) - (p2I == NULL ? 0 : p2I[j]);
-            }
-
-            for (int j = iMin + 1 ; j < iMax + 1 ; j++)
-            {
-                pOutI[j]  = pTemp[j] * iCoef;
-            }
-        }
-    }
-
-    delete[] pRankOut;
-    delete[] pRank1;
-    delete[] pRank2;
-
-    (*_pPolyOut)->updateRank();
-    return 0;
-}
-
-//_pSparse2 - _pSparse1
-int SubstractSparseToSparse(Sparse* _pSparse1, Sparse* _pSparse2, GenericType **_pSparseOut)
-{
-    //check scalar hidden in a sparse ;)
-    if (_pSparse1->getRows() == 1 && _pSparse1->getCols() == 1)
-    {
-        //do scalar - sp
-        Double* pDbl = NULL;
-        if (_pSparse1->isComplex())
-        {
-            std::complex<double> dbl = _pSparse1->getImg(0, 0);
-            pDbl = new Double(dbl.real(), dbl.imag());
-        }
-        else
-        {
-            pDbl = new Double(_pSparse1->get(0, 0));
-        }
-
-        SubstractSparseToDouble(_pSparse2, pDbl, (GenericType**)_pSparseOut);
-        delete pDbl;
-        return 0;
-    }
-
-    if (_pSparse2->getRows() == 1 && _pSparse2->getCols() == 1)
-    {
-        //do sp - scalar
-        Double* pDbl = NULL;
-        if (_pSparse2->isComplex())
-        {
-            std::complex<double> dbl = _pSparse2->getImg(0, 0);
-            pDbl = new Double(dbl.real(), dbl.imag());
-        }
-        else
-        {
-            pDbl = new Double(_pSparse2->get(0, 0));
-        }
-
-        SubstractDoubleToSparse(pDbl, _pSparse1, (GenericType**)_pSparseOut);
-        delete pDbl;
-        return 0;
-    }
-
-    if (_pSparse1->getRows() != _pSparse2->getRows() || _pSparse1->getCols() != _pSparse2->getCols())
-    {
-        //dimensions not match
-        return 1;
-    }
-
-    if (_pSparse1->nonZeros() == 0)
-    {
-        //sp - sp([])
-        *_pSparseOut = new Sparse(*_pSparse2);
-        return 0;
-    }
-
-    if (_pSparse2->nonZeros() == 0)
-    {
-        //sp([]) - sp
-        Sparse* pOut = new Sparse(*_pSparse1);
-        pOut->opposite();
-        *_pSparseOut = pOut;
-        return 0;
-    }
-
-    //copy _pSparse1 in _pSparseOut
-    *_pSparseOut = _pSparse2->substract(*_pSparse1);
-    return 0;
-}
-
-int SubstractSparseToDouble(Sparse* _pSparse, Double* _pDouble, GenericType **_pOut)
-{
-    //D - SP
-    int iOne = 1; //fortran
-    bool bComplex1 = _pSparse->isComplex();
-    bool bComplex2 = _pDouble->isComplex();
-
-    if (_pDouble->isIdentity())
-    {
-        //convert to sp
-        Sparse* pS = new Sparse(_pSparse->getRows(), _pSparse->getCols(), _pDouble->isComplex());
-        if (pS->isComplex())
-        {
-            for (int i = 0 ; i < std::min(_pSparse->getRows() , _pSparse->getCols()) ; i++)
-            {
-                pS->set(i, i, std::complex<double>(_pDouble->get(0), _pDouble->getImg(0)));
-            }
-        }
-        else
-        {
-            for (int i = 0 ; i < std::min(_pSparse->getRows() , _pSparse->getCols()) ; i++)
-            {
-                pS->set(i, i, _pDouble->get(0));
-            }
-        }
-
-        SubstractSparseToSparse(_pSparse, pS, _pOut);
-        delete pS;
-        return 0;
-    }
-
-    if (_pSparse->isScalar() && _pDouble->isScalar())
-    {
-        //d - sp
-        Double* pRes = _pDouble->clone()->getAs<Double>();
-        pRes->setComplex(bComplex1 | bComplex2);
-        if (bComplex1)
-        {
-            std::complex<double> dbl = _pSparse->getImg(0, 0);
-            pRes->set(0, pRes->get(0) - dbl.real());
-            pRes->setImg(0, pRes->getImg(0) - dbl.imag());
-        }
-        else
-        {
-            pRes->set(0, pRes->get(0) - _pSparse->get(0, 0));
-        }
-
-        *_pOut = pRes;
-        return 0;
-    }
-
-    if (_pDouble->isScalar())
-    {
-        //d - SP
-        Double* pRes = new Double(_pSparse->getRows(), _pSparse->getCols(), bComplex1 | bComplex2);
-        int iSize = _pSparse->getSize();
-        double dblVal = _pDouble->get(0);
-        C2F(dset)(&iSize, &dblVal, pRes->get(), &iOne);
-        if (bComplex2)
-        {
-            double dblValI = _pDouble->getImg(0);
-            C2F(dset)(&iSize, &dblValI, pRes->getImg(), &iOne);
-        }
-        else if (bComplex1)
-        {
-            //initialize imag part at 0
-            double dblValI = 0;
-            C2F(dset)(&iSize, &dblValI, pRes->getImg(), &iOne);
-        }
-
-        int nonZeros = static_cast<int>(_pSparse->nonZeros());
-        int* pRows = new int[nonZeros * 2];
-        _pSparse->outputRowCol(pRows);
-        int* pCols = pRows + nonZeros;
-
-        if (bComplex1)
-        {
-            for (int i = 0 ; i < nonZeros ; i++)
-            {
-                int iRow = static_cast<int>(pRows[i]) - 1;
-                int iCol = static_cast<int>(pCols[i]) - 1;
-                std::complex<double> dbl = _pSparse->getImg(iRow, iCol);
-                pRes->set(iRow, iCol, pRes->get(iRow, iCol) - dbl.real());
-                pRes->setImg(iRow, iCol, pRes->getImg(iRow, iCol) - dbl.imag());
-            }
-        }
-        else
-        {
-            for (int i = 0 ; i < nonZeros ; i++)
-            {
-                int iRow = static_cast<int>(pRows[i]) - 1;
-                int iCol = static_cast<int>(pCols[i]) - 1;
-                pRes->set(iRow, iCol, pRes->get(iRow, iCol) - _pSparse->get(iRow, iCol));
-            }
-        }
-        *_pOut = pRes;
-
-        //clear
-        delete[] pRows;
-        return 0;
-    }
-
-    if (_pSparse->isScalar())
-    {
-        //D - sp
-        Double* pRes = _pDouble->clone()->getAs<Double>();
-        pRes->setComplex(bComplex1 | bComplex2);
-
-        if (bComplex1)
-        {
-            double* pReal = pRes->get();
-            double* pImg = pRes->getImg();
-            for (int i = 0 ; i < pRes->getSize() ; i++)
-            {
-                std::complex<double> dbl = _pSparse->getImg(0, 0);
-                pReal[i] -= dbl.real();
-                pImg[i] -= dbl.imag();
-            }
-        }
-        else
-        {
-            double* pReal = pRes->get();
-            for (int i = 0 ; i < pRes->getSize() ; i++)
-            {
-                pReal[i] -= _pSparse->get(0, 0);
-            }
-        }
-        *_pOut = pRes;
-        return 0;
-    }
-
-
-    if (_pSparse->getRows() == _pDouble->getRows() && _pSparse->getCols() == _pDouble->getCols())
-    {
-        //D - SP
-        Double* pRes = _pDouble->clone()->getAs<Double>();
-        pRes->setComplex(bComplex1 | bComplex2);
-
-        int nonZeros = static_cast<int>(_pSparse->nonZeros());
-        int* pRows = new int[nonZeros * 2];
-        _pSparse->outputRowCol(pRows);
-        int* pCols = pRows + nonZeros;
-
-        if (bComplex1)
-        {
-            for (int i = 0 ; i < nonZeros ; i++)
-            {
-                int iRow = static_cast<int>(pRows[i]) - 1;
-                int iCol = static_cast<int>(pCols[i]) - 1;
-                std::complex<double> dbl = _pSparse->getImg(iRow, iCol);
-                pRes->set(iRow, iCol, pRes->get(iRow, iCol) - dbl.real());
-                pRes->setImg(iRow, iCol, pRes->getImg(iRow, iCol) - dbl.imag());
-            }
-        }
-        else
-        {
-            for (int i = 0 ; i < nonZeros ; i++)
-            {
-                int iRow = static_cast<int>(pRows[i]) - 1;
-                int iCol = static_cast<int>(pCols[i]) - 1;
-                pRes->set(iRow, iCol, pRes->get(iRow, iCol) - _pSparse->get(iRow, iCol));
-            }
-        }
-
-        //clear
-        delete[] pRows;
-        *_pOut = pRes;
-        return 0;
-    }
-    return 1;
-}
-
-int SubstractDoubleToSparse(Double* _pDouble, Sparse* _pSparse, GenericType **_pOut)
-{
-    //SP - D => -(D - SP)
-    int iRet = SubstractSparseToDouble(_pSparse, _pDouble, _pOut);
-    if (iRet)
-    {
-        return iRet;
-    }
-
-    //compute opposite of result
-    if ((*_pOut)->isDouble())
-    {
-        Double* pD          = (*_pOut)->getAs<Double>();
-        int iSize           = pD->getSize();
-        double dblMinusOne  = -1;
-        int iOne            = 1;
-
-        C2F(dscal)(&iSize, &dblMinusOne, pD->get(), &iOne);
-        if (pD->isComplex())
-        {
-            C2F(dscal)(&iSize, &dblMinusOne, pD->getImg(), &iOne);
-        }
-    }
-    else if ((*_pOut)->isSparse())
-    {
-        Sparse* pS = (*_pOut)->getAs<Sparse>();
-        pS->opposite();
-    }
-    else
-    {
-        return 1;
-    }
-
-    return 0;
-}
-
diff --git a/scilab/modules/ast/src/cpp/operations/types_subtraction.cpp b/scilab/modules/ast/src/cpp/operations/types_subtraction.cpp
new file mode 100644 (file)
index 0000000..f9982c2
--- /dev/null
@@ -0,0 +1,2692 @@
+/*
+*  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+*  Copyright (C) 2008-2008 - DIGITEO - Antoine ELIAS
+*  Copyright (C) 2010-2010 - DIGITEO - Bruno JOFRET
+*
+*  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 <stdio.h>
+
+#include "types_subtraction.hxx"
+#include "types_opposite.hxx"
+#include "double.hxx"
+#include "polynom.hxx"
+#include "int.hxx"
+#include "sparse.hxx"
+#include "generic_operations.hxx"
+
+extern "C"
+{
+#include "matrix_subtraction.h"
+#include "elem_common.h" //dset
+}
+
+using namespace types;
+
+//define arrays on operation functions
+static sub_function pSubfunction[types::InternalType::IdLast][types::InternalType::IdLast] = {NULL};
+
+void fillSubtractFunction()
+{
+#define scilab_fill_sub(id1, id2, func, typeIn1, typeIn2, typeOut) \
+    pSubfunction[types::InternalType::Id ## id1][types::InternalType::Id ## id2] = (sub_function)&sub_##func<typeIn1, typeIn2, typeOut>
+
+    //Double
+    //Matrix - Matrix
+    scilab_fill_sub(Double, Double, M_M, Double, Double, Double);
+    scilab_fill_sub(Double, Int8, M_M, Double, Int8, Int8);
+    scilab_fill_sub(Double, UInt8, M_M, Double, UInt8, UInt8);
+    scilab_fill_sub(Double, Int16, M_M, Double, Int16, Int16);
+    scilab_fill_sub(Double, UInt16, M_M, Double, UInt16, UInt16);
+    scilab_fill_sub(Double, Int32, M_M, Double, Int32, Int32);
+    scilab_fill_sub(Double, UInt32, M_M, Double, UInt32, UInt32);
+    scilab_fill_sub(Double, Int64, M_M, Double, Int64, Int64);
+    scilab_fill_sub(Double, UInt64, M_M, Double, UInt64, UInt64);
+    scilab_fill_sub(Double, Bool, M_M, Double, Bool, Double);
+    scilab_fill_sub(Double, Polynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_sub(Double, Sparse, M_M, Double, Sparse, Double);
+
+    //Matrix - Matrix Complex
+    scilab_fill_sub(Double, DoubleComplex, M_MC, Double, Double, Double);
+    scilab_fill_sub(Double, PolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_sub(Double, SparseComplex, M_M, Double, Sparse, Double);
+
+    //Matrix - Scalar
+    scilab_fill_sub(Double, ScalarDouble, M_S, Double, Double, Double);
+    scilab_fill_sub(Double, ScalarInt8, M_S, Double, Int8, Int8);
+    scilab_fill_sub(Double, ScalarUInt8, M_S, Double, UInt8, UInt8);
+    scilab_fill_sub(Double, ScalarInt16, M_S, Double, Int16, Int16);
+    scilab_fill_sub(Double, ScalarUInt16, M_S, Double, UInt16, UInt16);
+    scilab_fill_sub(Double, ScalarInt32, M_S, Double, Int32, Int32);
+    scilab_fill_sub(Double, ScalarUInt32, M_S, Double, UInt32, UInt32);
+    scilab_fill_sub(Double, ScalarInt64, M_S, Double, Int64, Int64);
+    scilab_fill_sub(Double, ScalarUInt64, M_S, Double, UInt64, UInt64);
+    scilab_fill_sub(Double, ScalarBool, M_S, Double, Bool, Double);
+    scilab_fill_sub(Double, ScalarPolynom, M_M, Double, Polynom, Polynom);
+
+    //Matrix - Scalar Complex
+    scilab_fill_sub(Double, ScalarDoubleComplex, M_SC, Double, Double, Double);
+    scilab_fill_sub(Double, ScalarPolynomComplex, M_M, Double, Polynom, Polynom);
+    //Matrix - Empty
+    scilab_fill_sub(Double, Empty, M_E, Double, Double, Double);
+
+
+    //Matrix Complex - Matrix
+    scilab_fill_sub(DoubleComplex, Double, MC_M, Double, Double, Double);
+    scilab_fill_sub(DoubleComplex, DoubleComplex, MC_MC, Double, Double, Double);
+    scilab_fill_sub(DoubleComplex, ScalarDouble, MC_S, Double, Double, Double);
+    scilab_fill_sub(DoubleComplex, ScalarDoubleComplex, MC_SC, Double, Double, Double);
+    scilab_fill_sub(DoubleComplex, Empty, MC_E, Double, Double, Double);
+    scilab_fill_sub(DoubleComplex, Polynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_sub(DoubleComplex, PolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_sub(DoubleComplex, ScalarPolynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_sub(DoubleComplex, ScalarPolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_sub(DoubleComplex, Sparse, M_M, Double, Sparse, Double);
+    scilab_fill_sub(DoubleComplex, SparseComplex, M_M, Double, Sparse, Double);
+
+    //Scalar - Matrix
+    scilab_fill_sub(ScalarDouble, Double, S_M, Double, Double, Double);
+    scilab_fill_sub(ScalarDouble, Int8, S_M, Double, Int8, Int8);
+    scilab_fill_sub(ScalarDouble, UInt8, S_M, Double, UInt8, UInt8);
+    scilab_fill_sub(ScalarDouble, Int16, S_M, Double, Int16, Int16);
+    scilab_fill_sub(ScalarDouble, UInt16, S_M, Double, UInt16, UInt16);
+    scilab_fill_sub(ScalarDouble, Int32, S_M, Double, Int32, Int32);
+    scilab_fill_sub(ScalarDouble, UInt32, S_M, Double, UInt32, UInt32);
+    scilab_fill_sub(ScalarDouble, Int64, S_M, Double, Int64, Int64);
+    scilab_fill_sub(ScalarDouble, UInt64, S_M, Double, UInt64, UInt64);
+    scilab_fill_sub(ScalarDouble, Bool, S_M, Double, Bool, Double);
+    scilab_fill_sub(ScalarDouble, Polynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_sub(ScalarDouble, Sparse, M_M, Double, Sparse, Double);
+
+    //Scalar - Matrix Complex
+    scilab_fill_sub(ScalarDouble, DoubleComplex, S_MC, Double, Double, Double);
+    scilab_fill_sub(ScalarDouble, PolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_sub(ScalarDouble, SparseComplex, M_M, Double, Sparse, Double);
+
+    //Scalar - Scalar
+    scilab_fill_sub(ScalarDouble, ScalarDouble, S_S, Double, Double, Double);
+    scilab_fill_sub(ScalarDouble, ScalarInt8, S_S, Double, Int8, Int8);
+    scilab_fill_sub(ScalarDouble, ScalarUInt8, S_S, Double, UInt8, UInt8);
+    scilab_fill_sub(ScalarDouble, ScalarInt16, S_S, Double, Int16, Int16);
+    scilab_fill_sub(ScalarDouble, ScalarUInt16, S_S, Double, UInt16, UInt16);
+    scilab_fill_sub(ScalarDouble, ScalarInt32, S_S, Double, Int32, Int32);
+    scilab_fill_sub(ScalarDouble, ScalarUInt32, S_S, Double, UInt32, UInt32);
+    scilab_fill_sub(ScalarDouble, ScalarInt64, S_S, Double, Int64, Int64);
+    scilab_fill_sub(ScalarDouble, ScalarUInt64, S_S, Double, UInt64, UInt64);
+    scilab_fill_sub(ScalarDouble, ScalarBool, S_S, Double, Bool, Double);
+    scilab_fill_sub(ScalarDouble, ScalarPolynom, M_M, Double, Polynom, Polynom);
+
+    //Scalar - Scalar Complex
+    scilab_fill_sub(ScalarDouble, ScalarDoubleComplex, S_SC, Double, Double, Double);
+    scilab_fill_sub(ScalarDouble, PolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_sub(ScalarDouble, ScalarPolynomComplex, M_M, Double, Polynom, Polynom);
+
+    //Scalar - Empty
+    scilab_fill_sub(ScalarDouble, Empty, S_E, Double, Double, Double);
+
+    //Scalar Complex - Matrix
+    scilab_fill_sub(ScalarDoubleComplex, Double, SC_M, Double, Double, Double);
+    scilab_fill_sub(ScalarDoubleComplex, Polynom, M_M, Double, Polynom, Polynom);
+    scilab_fill_sub(ScalarDoubleComplex, Sparse, M_M, Double, Sparse, Double);
+    //Scalar Complex - Matrix Complex
+    scilab_fill_sub(ScalarDoubleComplex, DoubleComplex, SC_MC, Double, Double, Double);
+    scilab_fill_sub(ScalarDoubleComplex, PolynomComplex, M_M, Double, Polynom, Polynom);
+    scilab_fill_sub(ScalarDoubleComplex, SparseComplex, M_M, Double, Sparse, Double);
+    //Scalar Complex - Scalar
+    scilab_fill_sub(ScalarDoubleComplex, ScalarDouble, SC_S, Double, Double, Double);
+    scilab_fill_sub(ScalarDoubleComplex, ScalarPolynom, M_M, Double, Polynom, Polynom);
+    //Scalar Complex - Scalar Complex
+    scilab_fill_sub(ScalarDoubleComplex, ScalarDoubleComplex, SC_SC, Double, Double, Double);
+    scilab_fill_sub(ScalarDoubleComplex, ScalarPolynomComplex, M_M, Double, Polynom, Polynom);
+    //Scalar Complex - Empty
+    scilab_fill_sub(ScalarDoubleComplex, Empty, SC_E, Double, Double, Double);
+
+    //Empty - Matrix
+    scilab_fill_sub(Empty, Double, E_M, Double, Double, Double);
+    scilab_fill_sub(Empty, Int8, E_M, Double, Int8, Int8);
+    scilab_fill_sub(Empty, UInt8, E_M, Double, UInt8, UInt8);
+    scilab_fill_sub(Empty, Int16, E_M, Double, Int16, Int16);
+    scilab_fill_sub(Empty, UInt16, E_M, Double, UInt16, UInt16);
+    scilab_fill_sub(Empty, Int32, E_M, Double, Int32, Int32);
+    scilab_fill_sub(Empty, UInt32, E_M, Double, UInt32, UInt32);
+    scilab_fill_sub(Empty, Int64, E_M, Double, Int64, Int64);
+    scilab_fill_sub(Empty, UInt64, E_M, Double, UInt64, UInt64);
+    //scilab_fill_sub(Empty, Bool, E_M, Double, Bool, Double);
+    scilab_fill_sub(Empty, Polynom, E_M, Double, Polynom, Polynom);
+    scilab_fill_sub(Empty, PolynomComplex, E_MC, Double, Polynom, Polynom);
+    scilab_fill_sub(Empty, Sparse, E_M, Double, Sparse, Sparse);
+    scilab_fill_sub(Empty, SparseComplex, E_MC, Double, Sparse, Sparse);
+
+    //Empty - Matrix Complex
+    scilab_fill_sub(Empty, DoubleComplex, E_MC, Double, Double, Double);
+    //Empty - Scalar
+    scilab_fill_sub(Empty, ScalarDouble, E_M, Double, Double, Double);
+    scilab_fill_sub(Empty, ScalarInt8, E_M, Double, Int8, Int8);
+    scilab_fill_sub(Empty, ScalarUInt8, E_M, Double, UInt8, UInt8);
+    scilab_fill_sub(Empty, ScalarInt16, E_M, Double, Int16, Int16);
+    scilab_fill_sub(Empty, ScalarUInt16, E_M, Double, UInt16, UInt16);
+    scilab_fill_sub(Empty, ScalarInt32, E_M, Double, Int32, Int32);
+    scilab_fill_sub(Empty, ScalarUInt32, E_M, Double, UInt32, UInt32);
+    scilab_fill_sub(Empty, ScalarInt64, E_M, Double, Int64, Int64);
+    scilab_fill_sub(Empty, ScalarUInt64, E_M, Double, UInt64, UInt64);
+    scilab_fill_sub(Empty, ScalarBool, E_M, Double, Bool, Double);
+    scilab_fill_sub(Empty, ScalarPolynom, E_M, Double, Polynom, Polynom);
+
+    //Empty - Scalar Complex
+    scilab_fill_sub(Empty, ScalarDoubleComplex, E_MC, Double, Double, Double);
+    scilab_fill_sub(Empty, ScalarPolynomComplex, E_MC, Double, Polynom, Polynom);
+    //Empty - Empty
+    scilab_fill_sub(Empty, Empty, E_M, Double, Double, Double);
+    //Empty - eye
+    scilab_fill_sub(Empty, Identity, E_I, Double, Double, Double);
+    scilab_fill_sub(Empty, IdentityComplex, E_IC, Double, Double, Double);
+
+    //Matrix - Identity
+    scilab_fill_sub(Double, Identity, M_I, Double, Double, Double);
+    scilab_fill_sub(Double, IdentityComplex, M_IC, Double, Double, Double);
+    scilab_fill_sub(DoubleComplex, Identity, MC_I, Double, Double, Double);
+    scilab_fill_sub(DoubleComplex, IdentityComplex, MC_IC, Double, Double, Double);
+    scilab_fill_sub(ScalarDouble, Identity, S_I, Double, Double, Double);
+    scilab_fill_sub(ScalarDouble, IdentityComplex, S_IC, Double, Double, Double);
+    scilab_fill_sub(ScalarDoubleComplex, Identity, SC_I, Double, Double, Double);
+    scilab_fill_sub(ScalarDoubleComplex, IdentityComplex, SC_IC, Double, Double, Double);
+
+    //Int8
+    //Matrix - Matrix
+    scilab_fill_sub(Int8, Double, M_M, Int8, Double, Int8);
+    scilab_fill_sub(Int8, Int8, M_M, Int8, Int8, Int8);
+    scilab_fill_sub(Int8, UInt8, M_M, Int8, UInt8, UInt8);
+    scilab_fill_sub(Int8, Int16, M_M, Int8, Int16, Int16);
+    scilab_fill_sub(Int8, UInt16, M_M, Int8, UInt16, UInt16);
+    scilab_fill_sub(Int8, Int32, M_M, Int8, Int32, Int32);
+    scilab_fill_sub(Int8, UInt32, M_M, Int8, UInt32, UInt32);
+    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);
+
+    //Matrix - Scalar
+    scilab_fill_sub(Int8, ScalarDouble, M_S, Int8, Double, Int8);
+    scilab_fill_sub(Int8, ScalarInt8, M_S, Int8, Int8, Int8);
+    scilab_fill_sub(Int8, ScalarUInt8, M_S, Int8, UInt8, UInt8);
+    scilab_fill_sub(Int8, ScalarInt16, M_S, Int8, Int16, Int16);
+    scilab_fill_sub(Int8, ScalarUInt16, M_S, Int8, UInt16, UInt16);
+    scilab_fill_sub(Int8, ScalarInt32, M_S, Int8, Int32, Int32);
+    scilab_fill_sub(Int8, ScalarUInt32, M_S, Int8, UInt32, UInt32);
+    scilab_fill_sub(Int8, ScalarInt64, M_S, Int8, Int64, Int64);
+    scilab_fill_sub(Int8, ScalarUInt64, M_S, Int8, UInt64, UInt64);
+    scilab_fill_sub(Int8, ScalarBool, M_S, Int8, Bool, Int8);
+
+    //Scalar - Matrix
+    scilab_fill_sub(ScalarInt8, Double, S_M, Int8, Double, Int8);
+    scilab_fill_sub(ScalarInt8, Int8, S_M, Int8, Int8, Int8);
+    scilab_fill_sub(ScalarInt8, UInt8, S_M, Int8, UInt8, UInt8);
+    scilab_fill_sub(ScalarInt8, Int16, S_M, Int8, Int16, Int16);
+    scilab_fill_sub(ScalarInt8, UInt16, S_M, Int8, UInt16, UInt16);
+    scilab_fill_sub(ScalarInt8, Int32, S_M, Int8, Int32, Int32);
+    scilab_fill_sub(ScalarInt8, UInt32, S_M, Int8, UInt32, UInt32);
+    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);
+
+    //Scalar - Scalar
+    scilab_fill_sub(ScalarInt8, ScalarDouble, S_S, Int8, Double, Int8);
+    scilab_fill_sub(ScalarInt8, ScalarInt8, S_S, Int8, Int8, Int8);
+    scilab_fill_sub(ScalarInt8, ScalarUInt8, S_S, Int8, UInt8, UInt8);
+    scilab_fill_sub(ScalarInt8, ScalarInt16, S_S, Int8, Int16, Int16);
+    scilab_fill_sub(ScalarInt8, ScalarUInt16, S_S, Int8, UInt16, UInt16);
+    scilab_fill_sub(ScalarInt8, ScalarInt32, S_S, Int8, Int32, Int32);
+    scilab_fill_sub(ScalarInt8, ScalarUInt32, S_S, Int8, UInt32, UInt32);
+    scilab_fill_sub(ScalarInt8, ScalarInt64, S_S, Int8, Int64, Int64);
+    scilab_fill_sub(ScalarInt8, ScalarUInt64, S_S, Int8, UInt64, UInt64);
+    scilab_fill_sub(ScalarInt8, ScalarBool, S_S, Int8, Bool, Int8);
+
+    //UInt8
+    //Matrix - Matrix
+    scilab_fill_sub(UInt8, Double, M_M, UInt8, Double, UInt8);
+    scilab_fill_sub(UInt8, Int8, M_M, UInt8, Int8, UInt8);
+    scilab_fill_sub(UInt8, UInt8, M_M, UInt8, UInt8, UInt8);
+    scilab_fill_sub(UInt8, Int16, M_M, UInt8, Int16, UInt16);
+    scilab_fill_sub(UInt8, UInt16, M_M, UInt8, UInt16, UInt16);
+    scilab_fill_sub(UInt8, Int32, M_M, UInt8, Int32, UInt32);
+    scilab_fill_sub(UInt8, UInt32, M_M, UInt8, UInt32, UInt32);
+    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);
+
+    //Matrix - Scalar
+    scilab_fill_sub(UInt8, ScalarDouble, M_S, UInt8, Double, UInt8);
+    scilab_fill_sub(UInt8, ScalarInt8, M_S, UInt8, Int8, UInt8);
+    scilab_fill_sub(UInt8, ScalarUInt8, M_S, UInt8, UInt8, UInt8);
+    scilab_fill_sub(UInt8, ScalarInt16, M_S, UInt8, Int16, UInt16);
+    scilab_fill_sub(UInt8, ScalarUInt16, M_S, UInt8, UInt16, UInt16);
+    scilab_fill_sub(UInt8, ScalarInt32, M_S, UInt8, Int32, UInt32);
+    scilab_fill_sub(UInt8, ScalarUInt32, M_S, UInt8, UInt32, UInt32);
+    scilab_fill_sub(UInt8, ScalarInt64, M_S, UInt8, Int64, UInt64);
+    scilab_fill_sub(UInt8, ScalarUInt64, M_S, UInt8, UInt64, UInt64);
+    scilab_fill_sub(UInt8, ScalarBool, M_S, UInt8, Bool, UInt8);
+
+    //Scalar - Matrix
+    scilab_fill_sub(ScalarUInt8, Double, S_M, UInt8, Double, UInt8);
+    scilab_fill_sub(ScalarUInt8, Int8, S_M, UInt8, Int8, UInt8);
+    scilab_fill_sub(ScalarUInt8, UInt8, S_M, UInt8, UInt8, UInt8);
+    scilab_fill_sub(ScalarUInt8, Int16, S_M, UInt8, Int16, UInt16);
+    scilab_fill_sub(ScalarUInt8, UInt16, S_M, UInt8, UInt16, UInt16);
+    scilab_fill_sub(ScalarUInt8, Int32, S_M, UInt8, Int32, UInt32);
+    scilab_fill_sub(ScalarUInt8, UInt32, S_M, UInt8, UInt32, UInt32);
+    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);
+
+    //Scalar - Scalar
+    scilab_fill_sub(ScalarUInt8, ScalarDouble, S_S, UInt8, Double, UInt8);
+    scilab_fill_sub(ScalarUInt8, ScalarInt8, S_S, UInt8, Int8, UInt8);
+    scilab_fill_sub(ScalarUInt8, ScalarUInt8, S_S, UInt8, UInt8, UInt8);
+    scilab_fill_sub(ScalarUInt8, ScalarInt16, S_S, UInt8, Int16, UInt16);
+    scilab_fill_sub(ScalarUInt8, ScalarUInt16, S_S, UInt8, UInt16, UInt16);
+    scilab_fill_sub(ScalarUInt8, ScalarInt32, S_S, UInt8, Int32, UInt32);
+    scilab_fill_sub(ScalarUInt8, ScalarUInt32, S_S, UInt8, UInt32, UInt32);
+    scilab_fill_sub(ScalarUInt8, ScalarInt64, S_S, UInt8, Int64, UInt64);
+    scilab_fill_sub(ScalarUInt8, ScalarUInt64, S_S, UInt8, UInt64, UInt64);
+    scilab_fill_sub(ScalarUInt8, ScalarBool, S_S, UInt8, Bool, UInt8);
+
+    //Int16
+    //Matrix - Matrix
+    scilab_fill_sub(Int16, Double, M_M, Int16, Double, Int16);
+    scilab_fill_sub(Int16, Int8, M_M, Int16, Int8, Int16);
+    scilab_fill_sub(Int16, UInt8, M_M, Int16, UInt8, UInt16);
+    scilab_fill_sub(Int16, Int16, M_M, Int16, Int16, Int16);
+    scilab_fill_sub(Int16, UInt16, M_M, Int16, UInt16, UInt16);
+    scilab_fill_sub(Int16, Int32, M_M, Int16, Int32, Int32);
+    scilab_fill_sub(Int16, UInt32, M_M, Int16, UInt32, UInt32);
+    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);
+
+    //Matrix - Scalar
+    scilab_fill_sub(Int16, ScalarDouble, M_S, Int16, Double, Int16);
+    scilab_fill_sub(Int16, ScalarInt8, M_S, Int16, Int8, Int16);
+    scilab_fill_sub(Int16, ScalarUInt8, M_S, Int16, UInt8, UInt16);
+    scilab_fill_sub(Int16, ScalarInt16, M_S, Int16, Int16, Int16);
+    scilab_fill_sub(Int16, ScalarUInt16, M_S, Int16, UInt16, UInt16);
+    scilab_fill_sub(Int16, ScalarInt32, M_S, Int16, Int32, Int32);
+    scilab_fill_sub(Int16, ScalarUInt32, M_S, Int16, UInt32, UInt32);
+    scilab_fill_sub(Int16, ScalarInt64, M_S, Int16, Int64, Int64);
+    scilab_fill_sub(Int16, ScalarUInt64, M_S, Int16, UInt64, UInt64);
+    scilab_fill_sub(Int16, ScalarBool, M_S, Int16, Bool, Int16);
+
+    //Scalar - Matrix
+    scilab_fill_sub(ScalarInt16, Double, S_M, Int16, Double, Int16);
+    scilab_fill_sub(ScalarInt16, Int8, S_M, Int16, Int8, Int16);
+    scilab_fill_sub(ScalarInt16, UInt8, S_M, Int16, UInt8, UInt16);
+    scilab_fill_sub(ScalarInt16, Int16, S_M, Int16, Int16, Int16);
+    scilab_fill_sub(ScalarInt16, UInt16, S_M, Int16, UInt16, UInt16);
+    scilab_fill_sub(ScalarInt16, Int32, S_M, Int16, Int32, Int32);
+    scilab_fill_sub(ScalarInt16, UInt32, S_M, Int16, UInt32, UInt32);
+    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);
+
+    //Scalar - Scalar
+    scilab_fill_sub(ScalarInt16, ScalarDouble, S_S, Int16, Double, Int16);
+    scilab_fill_sub(ScalarInt16, ScalarInt8, S_S, Int16, Int8, Int16);
+    scilab_fill_sub(ScalarInt16, ScalarUInt8, S_S, Int16, UInt8, UInt16);
+    scilab_fill_sub(ScalarInt16, ScalarInt16, S_S, Int16, Int16, Int16);
+    scilab_fill_sub(ScalarInt16, ScalarUInt16, S_S, Int16, UInt16, UInt16);
+    scilab_fill_sub(ScalarInt16, ScalarInt32, S_S, Int16, Int32, Int32);
+    scilab_fill_sub(ScalarInt16, ScalarUInt32, S_S, Int16, UInt32, UInt32);
+    scilab_fill_sub(ScalarInt16, ScalarInt64, S_S, Int16, Int64, Int64);
+    scilab_fill_sub(ScalarInt16, ScalarUInt64, S_S, Int16, UInt64, UInt64);
+    scilab_fill_sub(ScalarInt16, ScalarBool, S_S, Int16, Bool, Int16);
+
+    //UInt16
+    //Matrix - Matrix
+    scilab_fill_sub(UInt16, Double, M_M, UInt16, Double, UInt16);
+    scilab_fill_sub(UInt16, Int8, M_M, UInt16, Int8, UInt16);
+    scilab_fill_sub(UInt16, UInt8, M_M, UInt16, UInt8, UInt16);
+    scilab_fill_sub(UInt16, Int16, M_M, UInt16, Int16, UInt16);
+    scilab_fill_sub(UInt16, UInt16, M_M, UInt16, UInt16, UInt16);
+    scilab_fill_sub(UInt16, Int32, M_M, UInt16, Int32, UInt32);
+    scilab_fill_sub(UInt16, UInt32, M_M, UInt16, UInt32, UInt32);
+    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);
+
+    //Matrix - Scalar
+    scilab_fill_sub(UInt16, ScalarDouble, M_S, UInt16, Double, UInt16);
+    scilab_fill_sub(UInt16, ScalarInt8, M_S, UInt16, Int8, UInt16);
+    scilab_fill_sub(UInt16, ScalarUInt8, M_S, UInt16, UInt8, UInt16);
+    scilab_fill_sub(UInt16, ScalarInt16, M_S, UInt16, Int16, UInt16);
+    scilab_fill_sub(UInt16, ScalarUInt16, M_S, UInt16, UInt16, UInt16);
+    scilab_fill_sub(UInt16, ScalarInt32, M_S, UInt16, Int32, UInt32);
+    scilab_fill_sub(UInt16, ScalarUInt32, M_S, UInt16, UInt32, UInt32);
+    scilab_fill_sub(UInt16, ScalarInt64, M_S, UInt16, Int64, UInt64);
+    scilab_fill_sub(UInt16, ScalarUInt64, M_S, UInt16, UInt64, UInt64);
+    scilab_fill_sub(UInt16, ScalarBool, M_S, UInt16, Bool, UInt16);
+
+    //Scalar - Matrix
+    scilab_fill_sub(ScalarUInt16, Double, S_M, UInt16, Double, UInt16);
+    scilab_fill_sub(ScalarUInt16, Int8, S_M, UInt16, Int8, UInt16);
+    scilab_fill_sub(ScalarUInt16, UInt8, S_M, UInt16, UInt8, UInt16);
+    scilab_fill_sub(ScalarUInt16, Int16, S_M, UInt16, Int16, UInt16);
+    scilab_fill_sub(ScalarUInt16, UInt16, S_M, UInt16, UInt16, UInt16);
+    scilab_fill_sub(ScalarUInt16, Int32, S_M, UInt16, Int32, UInt32);
+    scilab_fill_sub(ScalarUInt16, UInt32, S_M, UInt16, UInt32, UInt32);
+    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);
+
+    //Scalar - Scalar
+    scilab_fill_sub(ScalarUInt16, ScalarDouble, S_S, UInt16, Double, UInt16);
+    scilab_fill_sub(ScalarUInt16, ScalarInt8, S_S, UInt16, Int8, UInt16);
+    scilab_fill_sub(ScalarUInt16, ScalarUInt8, S_S, UInt16, UInt8, UInt16);
+    scilab_fill_sub(ScalarUInt16, ScalarInt16, S_S, UInt16, Int16, UInt16);
+    scilab_fill_sub(ScalarUInt16, ScalarUInt16, S_S, UInt16, UInt16, UInt16);
+    scilab_fill_sub(ScalarUInt16, ScalarInt32, S_S, UInt16, Int32, UInt32);
+    scilab_fill_sub(ScalarUInt16, ScalarUInt32, S_S, UInt16, UInt32, UInt32);
+    scilab_fill_sub(ScalarUInt16, ScalarInt64, S_S, UInt16, Int64, UInt64);
+    scilab_fill_sub(ScalarUInt16, ScalarUInt64, S_S, UInt16, UInt64, UInt64);
+    scilab_fill_sub(ScalarUInt16, ScalarBool, S_S, UInt16, Bool, UInt16);
+
+    //Int32
+    //Matrix - Matrix
+    scilab_fill_sub(Int32, Double, M_M, Int32, Double, Int32);
+    scilab_fill_sub(Int32, Int8, M_M, Int32, Int8, Int32);
+    scilab_fill_sub(Int32, UInt8, M_M, Int32, UInt8, UInt32);
+    scilab_fill_sub(Int32, Int16, M_M, Int32, Int16, Int32);
+    scilab_fill_sub(Int32, UInt16, M_M, Int32, UInt16, UInt32);
+    scilab_fill_sub(Int32, Int32, M_M, Int32, Int32, Int32);
+    scilab_fill_sub(Int32, UInt32, M_M, Int32, UInt32, UInt32);
+    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);
+
+    //Matrix - Scalar
+    scilab_fill_sub(Int32, ScalarDouble, M_S, Int32, Double, Int32);
+    scilab_fill_sub(Int32, ScalarInt8, M_S, Int32, Int8, Int32);
+    scilab_fill_sub(Int32, ScalarUInt8, M_S, Int32, UInt8, UInt32);
+    scilab_fill_sub(Int32, ScalarInt16, M_S, Int32, Int16, Int32);
+    scilab_fill_sub(Int32, ScalarUInt16, M_S, Int32, UInt16, UInt32);
+    scilab_fill_sub(Int32, ScalarInt32, M_S, Int32, Int32, Int32);
+    scilab_fill_sub(Int32, ScalarUInt32, M_S, Int32, UInt32, UInt32);
+    scilab_fill_sub(Int32, ScalarInt64, M_S, Int32, Int64, Int64);
+    scilab_fill_sub(Int32, ScalarUInt64, M_S, Int32, UInt64, UInt64);
+    scilab_fill_sub(Int32, ScalarBool, M_S, Int32, Bool, Int32);
+
+    //Scalar - Matrix
+    scilab_fill_sub(ScalarInt32, Double, S_M, Int32, Double, Int32);
+    scilab_fill_sub(ScalarInt32, Int8, S_M, Int32, Int8, Int32);
+    scilab_fill_sub(ScalarInt32, UInt8, S_M, Int32, UInt8, UInt32);
+    scilab_fill_sub(ScalarInt32, Int16, S_M, Int32, Int16, Int32);
+    scilab_fill_sub(ScalarInt32, UInt16, S_M, Int32, UInt16, UInt32);
+    scilab_fill_sub(ScalarInt32, Int32, S_M, Int32, Int32, Int32);
+    scilab_fill_sub(ScalarInt32, UInt32, S_M, Int32, UInt32, UInt32);
+    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);
+
+    //Scalar - Scalar
+    scilab_fill_sub(ScalarInt32, ScalarDouble, S_S, Int32, Double, Int32);
+    scilab_fill_sub(ScalarInt32, ScalarInt8, S_S, Int32, Int8, Int32);
+    scilab_fill_sub(ScalarInt32, ScalarUInt8, S_S, Int32, UInt8, UInt32);
+    scilab_fill_sub(ScalarInt32, ScalarInt16, S_S, Int32, Int16, Int32);
+    scilab_fill_sub(ScalarInt32, ScalarUInt16, S_S, Int32, UInt16, UInt32);
+    scilab_fill_sub(ScalarInt32, ScalarInt32, S_S, Int32, Int32, Int32);
+    scilab_fill_sub(ScalarInt32, ScalarUInt32, S_S, Int32, UInt32, UInt32);
+    scilab_fill_sub(ScalarInt32, ScalarInt64, S_S, Int32, Int64, Int64);
+    scilab_fill_sub(ScalarInt32, ScalarUInt64, S_S, Int32, UInt64, UInt64);
+    scilab_fill_sub(ScalarInt32, ScalarBool, S_S, Int32, Bool, Int32);
+
+    //UInt32
+    //Matrix - Matrix
+    scilab_fill_sub(UInt32, Double, M_M, UInt32, Double, UInt32);
+    scilab_fill_sub(UInt32, Int8, M_M, UInt32, Int8, UInt32);
+    scilab_fill_sub(UInt32, UInt8, M_M, UInt32, UInt8, UInt32);
+    scilab_fill_sub(UInt32, Int16, M_M, UInt32, Int16, UInt32);
+    scilab_fill_sub(UInt32, UInt16, M_M, UInt32, UInt16, UInt32);
+    scilab_fill_sub(UInt32, Int32, M_M, UInt32, Int32, UInt32);
+    scilab_fill_sub(UInt32, UInt32, M_M, UInt32, UInt32, UInt32);
+    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);
+
+    //Matrix - Scalar
+    scilab_fill_sub(UInt32, ScalarDouble, M_S, UInt32, Double, UInt32);
+    scilab_fill_sub(UInt32, ScalarInt8, M_S, UInt32, Int8, UInt32);
+    scilab_fill_sub(UInt32, ScalarUInt8, M_S, UInt32, UInt8, UInt32);
+    scilab_fill_sub(UInt32, ScalarInt16, M_S, UInt32, Int16, UInt32);
+    scilab_fill_sub(UInt32, ScalarUInt16, M_S, UInt32, UInt16, UInt32);
+    scilab_fill_sub(UInt32, ScalarInt32, M_S, UInt32, Int32, UInt32);
+    scilab_fill_sub(UInt32, ScalarUInt32, M_S, UInt32, UInt32, UInt32);
+    scilab_fill_sub(UInt32, ScalarInt64, M_S, UInt32, Int64, UInt64);
+    scilab_fill_sub(UInt32, ScalarUInt64, M_S, UInt32, UInt64, UInt64);
+    scilab_fill_sub(UInt32, ScalarBool, M_S, UInt32, Bool, UInt32);
+
+    //Scalar - Matrix
+    scilab_fill_sub(ScalarUInt32, Double, S_M, UInt32, Double, UInt32);
+    scilab_fill_sub(ScalarUInt32, Int8, S_M, UInt32, Int8, UInt32);
+    scilab_fill_sub(ScalarUInt32, UInt8, S_M, UInt32, UInt8, UInt32);
+    scilab_fill_sub(ScalarUInt32, Int16, S_M, UInt32, Int16, UInt32);
+    scilab_fill_sub(ScalarUInt32, UInt16, S_M, UInt32, UInt16, UInt32);
+    scilab_fill_sub(ScalarUInt32, Int32, S_M, UInt32, Int32, UInt32);
+    scilab_fill_sub(ScalarUInt32, UInt32, S_M, UInt32, UInt32, UInt32);
+    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);
+
+    //Scalar - Scalar
+    scilab_fill_sub(ScalarUInt32, ScalarDouble, S_S, UInt32, Double, UInt32);
+    scilab_fill_sub(ScalarUInt32, ScalarInt8, S_S, UInt32, Int8, UInt32);
+    scilab_fill_sub(ScalarUInt32, ScalarUInt8, S_S, UInt32, UInt8, UInt32);
+    scilab_fill_sub(ScalarUInt32, ScalarInt16, S_S, UInt32, Int16, UInt32);
+    scilab_fill_sub(ScalarUInt32, ScalarUInt16, S_S, UInt32, UInt16, UInt32);
+    scilab_fill_sub(ScalarUInt32, ScalarInt32, S_S, UInt32, Int32, UInt32);
+    scilab_fill_sub(ScalarUInt32, ScalarUInt32, S_S, UInt32, UInt32, UInt32);
+    scilab_fill_sub(ScalarUInt32, ScalarInt64, S_S, UInt32, Int64, UInt64);
+    scilab_fill_sub(ScalarUInt32, ScalarUInt64, S_S, UInt32, UInt64, UInt64);
+    scilab_fill_sub(ScalarUInt32, ScalarBool, S_S, UInt32, Bool, UInt32);
+
+    //Int64
+    //Matrix - Matrix
+    scilab_fill_sub(Int64, Double, M_M, Int64, Double, Int64);
+    scilab_fill_sub(Int64, Int8, M_M, Int64, Int8, Int64);
+    scilab_fill_sub(Int64, UInt8, M_M, Int64, UInt8, UInt64);
+    scilab_fill_sub(Int64, Int16, M_M, Int64, Int16, Int64);
+    scilab_fill_sub(Int64, UInt16, M_M, Int64, UInt16, UInt64);
+    scilab_fill_sub(Int64, Int32, M_M, Int64, Int32, Int64);
+    scilab_fill_sub(Int64, UInt32, M_M, Int64, UInt32, UInt64);
+    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);
+
+    //Matrix - Scalar
+    scilab_fill_sub(Int64, ScalarDouble, M_S, Int64, Double, Int64);
+    scilab_fill_sub(Int64, ScalarInt8, M_S, Int64, Int8, Int64);
+    scilab_fill_sub(Int64, ScalarUInt8, M_S, Int64, UInt8, UInt64);
+    scilab_fill_sub(Int64, ScalarInt16, M_S, Int64, Int16, Int64);
+    scilab_fill_sub(Int64, ScalarUInt16, M_S, Int64, UInt16, UInt64);
+    scilab_fill_sub(Int64, ScalarInt32, M_S, Int64, Int32, Int64);
+    scilab_fill_sub(Int64, ScalarUInt32, M_S, Int64, UInt32, UInt64);
+    scilab_fill_sub(Int64, ScalarInt64, M_S, Int64, Int64, Int64);
+    scilab_fill_sub(Int64, ScalarUInt64, M_S, Int64, UInt64, UInt64);
+    scilab_fill_sub(Int64, ScalarBool, M_S, Int64, Bool, Int64);
+
+    //Scalar - Matrix
+    scilab_fill_sub(ScalarInt64, Double, S_M, Int64, Double, Int64);
+    scilab_fill_sub(ScalarInt64, Int8, S_M, Int64, Int8, Int64);
+    scilab_fill_sub(ScalarInt64, UInt8, S_M, Int64, UInt8, UInt64);
+    scilab_fill_sub(ScalarInt64, Int16, S_M, Int64, Int16, Int64);
+    scilab_fill_sub(ScalarInt64, UInt16, S_M, Int64, UInt16, UInt64);
+    scilab_fill_sub(ScalarInt64, Int32, S_M, Int64, Int32, Int64);
+    scilab_fill_sub(ScalarInt64, UInt32, S_M, Int64, UInt32, UInt64);
+    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);
+
+    //Scalar - Scalar
+    scilab_fill_sub(ScalarInt64, ScalarDouble, S_S, Int64, Double, Int64);
+    scilab_fill_sub(ScalarInt64, ScalarInt8, S_S, Int64, Int8, Int64);
+    scilab_fill_sub(ScalarInt64, ScalarUInt8, S_S, Int64, UInt8, UInt64);
+    scilab_fill_sub(ScalarInt64, ScalarInt16, S_S, Int64, Int16, Int64);
+    scilab_fill_sub(ScalarInt64, ScalarUInt16, S_S, Int64, UInt16, UInt64);
+    scilab_fill_sub(ScalarInt64, ScalarInt32, S_S, Int64, Int32, Int64);
+    scilab_fill_sub(ScalarInt64, ScalarUInt32, S_S, Int64, UInt32, UInt64);
+    scilab_fill_sub(ScalarInt64, ScalarInt64, S_S, Int64, Int64, Int64);
+    scilab_fill_sub(ScalarInt64, ScalarUInt64, S_S, Int64, UInt64, UInt64);
+    scilab_fill_sub(ScalarInt64, ScalarBool, S_S, Int64, Bool, Int64);
+
+    //UInt64
+    //Matrix - Matrix
+    scilab_fill_sub(UInt64, Double, M_M, UInt64, Double, UInt64);
+    scilab_fill_sub(UInt64, Int8, M_M, UInt64, Int8, UInt64);
+    scilab_fill_sub(UInt64, UInt8, M_M, UInt64, UInt8, UInt64);
+    scilab_fill_sub(UInt64, Int16, M_M, UInt64, Int16, UInt64);
+    scilab_fill_sub(UInt64, UInt16, M_M, UInt64, UInt16, UInt64);
+    scilab_fill_sub(UInt64, Int32, M_M, UInt64, Int32, UInt64);
+    scilab_fill_sub(UInt64, UInt32, M_M, UInt64, UInt32, UInt64);
+    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);
+
+    //Matrix - Scalar
+    scilab_fill_sub(UInt64, ScalarDouble, M_S, UInt64, Double, UInt64);
+    scilab_fill_sub(UInt64, ScalarInt8, M_S, UInt64, Int8, UInt64);
+    scilab_fill_sub(UInt64, ScalarUInt8, M_S, UInt64, UInt8, UInt64);
+    scilab_fill_sub(UInt64, ScalarInt16, M_S, UInt64, Int16, UInt64);
+    scilab_fill_sub(UInt64, ScalarUInt16, M_S, UInt64, UInt16, UInt64);
+    scilab_fill_sub(UInt64, ScalarInt32, M_S, UInt64, Int32, UInt64);
+    scilab_fill_sub(UInt64, ScalarUInt32, M_S, UInt64, UInt32, UInt64);
+    scilab_fill_sub(UInt64, ScalarInt64, M_S, UInt64, Int64, UInt64);
+    scilab_fill_sub(UInt64, ScalarUInt64, M_S, UInt64, UInt64, UInt64);
+    scilab_fill_sub(UInt64, ScalarBool, M_S, UInt64, Bool, UInt64);
+
+    //Scalar - Matrix
+    scilab_fill_sub(ScalarUInt64, Double, S_M, UInt64, Double, UInt64);
+    scilab_fill_sub(ScalarUInt64, Int8, S_M, UInt64, Int8, UInt64);
+    scilab_fill_sub(ScalarUInt64, UInt8, S_M, UInt64, UInt8, UInt64);
+    scilab_fill_sub(ScalarUInt64, Int16, S_M, UInt64, Int16, UInt64);
+    scilab_fill_sub(ScalarUInt64, UInt16, S_M, UInt64, UInt16, UInt64);
+    scilab_fill_sub(ScalarUInt64, Int32, S_M, UInt64, Int32, UInt64);
+    scilab_fill_sub(ScalarUInt64, UInt32, S_M, UInt64, UInt32, UInt64);
+    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);
+
+    //Scalar - Scalar
+    scilab_fill_sub(ScalarUInt64, ScalarDouble, S_S, UInt64, Double, UInt64);
+    scilab_fill_sub(ScalarUInt64, ScalarInt8, S_S, UInt64, Int8, UInt64);
+    scilab_fill_sub(ScalarUInt64, ScalarUInt8, S_S, UInt64, UInt8, UInt64);
+    scilab_fill_sub(ScalarUInt64, ScalarInt16, S_S, UInt64, Int16, UInt64);
+    scilab_fill_sub(ScalarUInt64, ScalarUInt16, S_S, UInt64, UInt16, UInt64);
+    scilab_fill_sub(ScalarUInt64, ScalarInt32, S_S, UInt64, Int32, UInt64);
+    scilab_fill_sub(ScalarUInt64, ScalarUInt32, S_S, UInt64, UInt32, UInt64);
+    scilab_fill_sub(ScalarUInt64, ScalarInt64, S_S, UInt64, Int64, UInt64);
+    scilab_fill_sub(ScalarUInt64, ScalarUInt64, S_S, UInt64, UInt64, UInt64);
+    scilab_fill_sub(ScalarUInt64, ScalarBool, S_S, UInt64, Bool, UInt64);
+
+    //Bool
+    //Matrix - Matrix
+    scilab_fill_sub(Bool, Double, M_M, Bool, Double, Double);
+    scilab_fill_sub(Bool, Int8, M_M, Bool, Int8, Int8);
+    scilab_fill_sub(Bool, UInt8, M_M, Bool, UInt8, UInt8);
+    scilab_fill_sub(Bool, Int16, M_M, Bool, Int16, Int16);
+    scilab_fill_sub(Bool, UInt16, M_M, Bool, UInt16, UInt16);
+    scilab_fill_sub(Bool, Int32, M_M, Bool, Int32, Int32);
+    scilab_fill_sub(Bool, UInt32, M_M, Bool, UInt32, UInt32);
+    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);
+
+    //Matrix - Scalar
+    scilab_fill_sub(Bool, ScalarDouble, M_S, Bool, Double, Double);
+    scilab_fill_sub(Bool, ScalarInt8, M_S, Bool, Int8, Int8);
+    scilab_fill_sub(Bool, ScalarUInt8, M_S, Bool, UInt8, UInt8);
+    scilab_fill_sub(Bool, ScalarInt16, M_S, Bool, Int16, Int16);
+    scilab_fill_sub(Bool, ScalarUInt16, M_S, Bool, UInt16, UInt16);
+    scilab_fill_sub(Bool, ScalarInt32, M_S, Bool, Int32, Int32);
+    scilab_fill_sub(Bool, ScalarUInt32, M_S, Bool, UInt32, UInt32);
+    scilab_fill_sub(Bool, ScalarInt64, M_S, Bool, Int64, Int64);
+    scilab_fill_sub(Bool, ScalarUInt64, M_S, Bool, UInt64, UInt64);
+    scilab_fill_sub(Bool, ScalarBool, M_S, Bool, Bool, Bool);
+
+    //Scalar - Matrix
+    scilab_fill_sub(ScalarBool, Double, S_M, Bool, Double, Double);
+    scilab_fill_sub(ScalarBool, Int8, S_M, Bool, Int8, Int8);
+    scilab_fill_sub(ScalarBool, UInt8, S_M, Bool, UInt8, UInt8);
+    scilab_fill_sub(ScalarBool, Int16, S_M, Bool, Int16, Int16);
+    scilab_fill_sub(ScalarBool, UInt16, S_M, Bool, UInt16, UInt16);
+    scilab_fill_sub(ScalarBool, Int32, S_M, Bool, Int32, Int32);
+    scilab_fill_sub(ScalarBool, UInt32, S_M, Bool, UInt32, UInt32);
+    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);
+
+    //Scalar - Scalar
+    scilab_fill_sub(ScalarBool, ScalarDouble, S_S, Bool, Double, Double);
+    scilab_fill_sub(ScalarBool, ScalarInt8, S_S, Bool, Int8, Int8);
+    scilab_fill_sub(ScalarBool, ScalarUInt8, S_S, Bool, UInt8, UInt8);
+    scilab_fill_sub(ScalarBool, ScalarInt16, S_S, Bool, Int16, Int16);
+    scilab_fill_sub(ScalarBool, ScalarUInt16, S_S, Bool, UInt16, UInt16);
+    scilab_fill_sub(ScalarBool, ScalarInt32, S_S, Bool, Int32, Int32);
+    scilab_fill_sub(ScalarBool, ScalarUInt32, S_S, Bool, UInt32, UInt32);
+    scilab_fill_sub(ScalarBool, ScalarInt64, S_S, Bool, Int64, Int64);
+    scilab_fill_sub(ScalarBool, ScalarUInt64, S_S, Bool, UInt64, UInt64);
+    scilab_fill_sub(ScalarBool, ScalarBool, S_S, Bool, Bool, Bool);
+
+    //Identity
+    scilab_fill_sub(Identity, Double, I_M, Double, Double, Double);
+    scilab_fill_sub(Identity, DoubleComplex, I_MC, Double, Double, Double);
+    scilab_fill_sub(Identity, ScalarDouble, I_S, Double, Double, Double);
+    scilab_fill_sub(Identity, ScalarDoubleComplex, I_SC, Double, Double, Double);
+    scilab_fill_sub(Identity, Identity, I_I, Double, Double, Double);
+    scilab_fill_sub(Identity, IdentityComplex, I_IC, Double, Double, Double);
+    scilab_fill_sub(Identity, Empty, I_E, Double, Double, Double);
+
+    scilab_fill_sub(Identity, Polynom, I_M, Double, Polynom, Polynom);
+    scilab_fill_sub(Identity, PolynomComplex, I_MC, Double, Polynom, Polynom);
+    scilab_fill_sub(Identity, ScalarPolynom, I_M, Double, Polynom, Polynom);
+    scilab_fill_sub(Identity, ScalarPolynomComplex, I_MC, Double, Polynom, Polynom);
+    scilab_fill_sub(Identity, Sparse, M_M, Double, Sparse, Sparse);
+    scilab_fill_sub(Identity, SparseComplex, M_M, Double, Sparse, Sparse);
+
+    scilab_fill_sub(IdentityComplex, Double, IC_M, Double, Double, Double);
+    scilab_fill_sub(IdentityComplex, DoubleComplex, IC_MC, Double, Double, Double);
+    scilab_fill_sub(IdentityComplex, ScalarDouble, IC_S, Double, Double, Double);
+    scilab_fill_sub(IdentityComplex, ScalarDoubleComplex, IC_SC, Double, Double, Double);
+    scilab_fill_sub(IdentityComplex, Identity, IC_I, Double, Double, Double);
+    scilab_fill_sub(IdentityComplex, IdentityComplex, IC_IC, Double, Double, Double);
+    scilab_fill_sub(IdentityComplex, Empty, IC_E, Double, Double, Double);
+
+    scilab_fill_sub(IdentityComplex, Polynom, IC_M, Double, Polynom, Polynom);
+    scilab_fill_sub(IdentityComplex, PolynomComplex, IC_MC, Double, Polynom, Polynom);
+    scilab_fill_sub(IdentityComplex, ScalarPolynom, IC_M, Double, Polynom, Polynom);
+    scilab_fill_sub(IdentityComplex, ScalarPolynomComplex, IC_MC, Double, Polynom, Polynom);
+    scilab_fill_sub(IdentityComplex, Sparse, M_M, Double, Sparse, Sparse);
+    scilab_fill_sub(IdentityComplex, SparseComplex, M_M, Double, Sparse, Sparse);
+
+    scilab_fill_sub(Identity, ScalarInt8, I_S, Double, Int8, Int8);
+    scilab_fill_sub(Identity, ScalarUInt8, I_S, Double, UInt8, UInt8);
+    scilab_fill_sub(Identity, ScalarInt16, I_S, Double, Int16, Int16);
+    scilab_fill_sub(Identity, ScalarUInt16, I_S, Double, UInt16, UInt16);
+    scilab_fill_sub(Identity, ScalarInt32, I_S, Double, Int32, Int32);
+    scilab_fill_sub(Identity, ScalarUInt32, I_S, Double, UInt32, UInt32);
+    scilab_fill_sub(Identity, ScalarInt64, I_S, Double, Int64, Int64);
+    scilab_fill_sub(Identity, ScalarUInt64, I_S, Double, UInt64, UInt64);
+
+    scilab_fill_sub(Identity, Int8, I_M, Double, Int8, Int8);
+    scilab_fill_sub(Identity, UInt8, I_M, Double, UInt8, UInt8);
+    scilab_fill_sub(Identity, Int16, I_M, Double, Int16, Int16);
+    scilab_fill_sub(Identity, UInt16, I_M, Double, UInt16, UInt16);
+    scilab_fill_sub(Identity, Int32, I_M, Double, Int32, Int32);
+    scilab_fill_sub(Identity, UInt32, I_M, Double, UInt32, UInt32);
+    scilab_fill_sub(Identity, Int64, I_M, Double, Int64, Int64);
+    scilab_fill_sub(Identity, UInt64, I_M, Double, UInt64, UInt64);
+
+    //Polynom
+
+    //poly - poly
+    scilab_fill_sub(Polynom, Polynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_sub(Polynom, PolynomComplex, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_sub(PolynomComplex, Polynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_sub(PolynomComplex, PolynomComplex, M_M, Polynom, Polynom, Polynom);
+
+    //poly - scalar poly
+    scilab_fill_sub(Polynom, ScalarPolynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_sub(Polynom, ScalarPolynomComplex, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_sub(PolynomComplex, ScalarPolynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_sub(PolynomComplex, ScalarPolynomComplex, M_M, Polynom, Polynom, Polynom);
+
+    //poly - double
+    scilab_fill_sub(Polynom, Double, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(Polynom, DoubleComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(PolynomComplex, Double, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(PolynomComplex, DoubleComplex, M_M, Polynom, Double, Polynom);
+
+    //poly - scalar double
+    scilab_fill_sub(Polynom, ScalarDouble, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(Polynom, ScalarDoubleComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(PolynomComplex, ScalarDouble, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(PolynomComplex, ScalarDoubleComplex, M_M, Polynom, Double, Polynom);
+
+    //poly - []
+    scilab_fill_sub(Polynom, Empty, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(PolynomComplex, Empty, M_M, Polynom, Double, Polynom);
+
+    //poly - eye
+    scilab_fill_sub(Polynom, Identity, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(Polynom, IdentityComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(PolynomComplex, Identity, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(PolynomComplex, IdentityComplex, M_M, Polynom, Double, Polynom);
+
+    //scalar poly - poly
+    scilab_fill_sub(ScalarPolynom, Polynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_sub(ScalarPolynom, PolynomComplex, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_sub(ScalarPolynomComplex, Polynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_sub(ScalarPolynomComplex, PolynomComplex, M_M, Polynom, Polynom, Polynom);
+
+    //scalar poly - scalar poly
+    scilab_fill_sub(ScalarPolynom, ScalarPolynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_sub(ScalarPolynom, ScalarPolynomComplex, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_sub(ScalarPolynomComplex, ScalarPolynom, M_M, Polynom, Polynom, Polynom);
+    scilab_fill_sub(ScalarPolynomComplex, ScalarPolynomComplex, M_M, Polynom, Polynom, Polynom);
+
+    //scalar poly - double
+    scilab_fill_sub(ScalarPolynom, Double, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(ScalarPolynom, DoubleComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(ScalarPolynomComplex, Double, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(ScalarPolynomComplex, DoubleComplex, M_M, Polynom, Double, Polynom);
+
+    //scalar poly - scalar double
+    scilab_fill_sub(ScalarPolynom, ScalarDouble, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(ScalarPolynom, ScalarDoubleComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(ScalarPolynomComplex, ScalarDouble, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(ScalarPolynomComplex, ScalarDoubleComplex, M_M, Polynom, Double, Polynom);
+
+    //scalar poly - []
+    scilab_fill_sub(ScalarPolynom, Empty, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(ScalarPolynomComplex, Empty, M_M, Polynom, Double, Polynom);
+
+    //scalar poly - eye
+    scilab_fill_sub(ScalarPolynom, Identity, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(ScalarPolynom, IdentityComplex, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(ScalarPolynomComplex, Identity, M_M, Polynom, Double, Polynom);
+    scilab_fill_sub(ScalarPolynomComplex, IdentityComplex, M_M, Polynom, Double, Polynom);
+
+    //Sparse
+    scilab_fill_sub(Sparse, Sparse, M_M, Sparse, Sparse, Sparse);
+    scilab_fill_sub(Sparse, SparseComplex, M_M, Sparse, Sparse, Sparse);
+    scilab_fill_sub(Sparse, Double, M_M, Sparse, Double, Double);
+    scilab_fill_sub(Sparse, DoubleComplex, M_M, Sparse, Double, Double);
+    scilab_fill_sub(Sparse, ScalarDouble, M_M, Sparse, Double, Double);
+    scilab_fill_sub(Sparse, ScalarDoubleComplex, M_M, Sparse, Double, Double);
+
+    scilab_fill_sub(Sparse, Empty, M_M, Sparse, Double, Sparse);
+    scilab_fill_sub(Sparse, Identity, M_M, Sparse, Double, Sparse);
+    scilab_fill_sub(Sparse, IdentityComplex, M_M, Sparse, Double, Sparse);
+
+    scilab_fill_sub(SparseComplex, Sparse, M_M, Sparse, Sparse, Sparse);
+    scilab_fill_sub(SparseComplex, SparseComplex, M_M, Sparse, Sparse, Sparse);
+    scilab_fill_sub(SparseComplex, Double, M_M, Sparse, Double, Double);
+    scilab_fill_sub(SparseComplex, DoubleComplex, M_M, Sparse, Double, Double);
+    scilab_fill_sub(SparseComplex, ScalarDouble, M_M, Sparse, Double, Double);
+    scilab_fill_sub(SparseComplex, ScalarDoubleComplex, M_M, Sparse, Double, Double);
+
+    scilab_fill_sub(SparseComplex, Empty, M_M, Sparse, Double, Sparse);
+    scilab_fill_sub(SparseComplex, Identity, M_M, Sparse, Double, Sparse);
+    scilab_fill_sub(SparseComplex, IdentityComplex, M_M, Sparse, Double, Sparse);
+
+#undef scilab_fill_sub
+}
+
+InternalType* GenericMinus(InternalType* _pLeftOperand, InternalType* _pRightOperand)
+{
+    InternalType *pResult = NULL;
+
+    sub_function sub = pSubfunction[_pLeftOperand->getId()][_pRightOperand->getId()];
+    if (sub)
+    {
+        pResult = sub(_pLeftOperand, _pRightOperand);
+        if (pResult)
+        {
+            return pResult;
+        }
+    }
+
+    /*
+    ** Default case : Return NULL will Call Overloading.
+    */
+    return NULL;
+}
+
+template<class T, class U, class O>
+InternalType* sub_M_M(T *_pL, U *_pR)
+{
+    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);
+
+    sub(_pL->get(), (long long)_pL->getSize(), _pR->get(), pOut->get());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_M_MC(T *_pL, U *_pR)
+{
+    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);
+
+    sub(_pL->get(), (long long)_pL->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+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());
+    return pOut;
+}
+
+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());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_M_E(T *_pL, U *_pR)
+{
+    return _pL;
+}
+
+
+template<class T, class U, class O>
+InternalType* sub_MC_M(T *_pL, U *_pR)
+{
+    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);
+
+    sub(_pL->get(), _pL->getImg(), (long long)_pL->getSize(), _pR->get(), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_MC_MC(T *_pL, U *_pR)
+{
+    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);
+
+    sub(_pL->get(), _pL->getImg(), (long long)_pL->getSize(), _pR->get(), _pR->getImg(), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+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());
+    return pOut;
+}
+
+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());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_MC_E(T *_pL, U *_pR)
+{
+    return _pL;
+}
+
+
+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());
+    return pOut;
+}
+
+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());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_S_S(T *_pL, U *_pR)
+{
+    O* pOut = new O(0);
+    sub(_pL->get(0), _pR->get(0), pOut->get());
+    return pOut;
+}
+
+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());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_S_E(T *_pL, U *_pR)
+{
+    O* pOut = new O(0);
+    sub(_pL->get(0), pOut->get());
+    return pOut;
+}
+
+
+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());
+    return pOut;
+}
+
+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());
+    return pOut;
+}
+
+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());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_SC_SC(T *_pL, U *_pR)
+{
+    O* pOut = new O(0.0, 0.0);
+    sub(_pL->get(0), _pL->getImg(0), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_SC_E(T *_pL, U *_pR)
+{
+    O* pOut = new O(0.0, 0.0);
+    sub(_pL->get(0), _pL->getImg(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+
+template<class T, class U, class O>
+InternalType* sub_E_M(T *_pL, U *_pR)
+{
+    return opposite_M<U, O>(_pR);
+}
+
+template<class T, class U, class O>
+InternalType* sub_E_MC(T *_pL, U *_pR)
+{
+    return opposite_MC<U, O>(_pR);
+}
+
+template<class T, class U, class O>
+InternalType* sub_E_E(T *_pL, U *_pR)
+{
+    Double* pOut = Double::Empty();
+    sub();
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_I_M(T *_pL, U *_pR)
+{
+    int iDims = _pR->getDims();
+    int* piDims = _pR->getDimsArray();
+    O* pOut = (O*)opposite_M<U, O>(_pR);
+    double dblLeft = _pL->get(0);
+    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];
+        }
+    }
+
+    for (int i = 0 ; i < iLeadDims ; ++i)
+    {
+        for (int j = 0 ; j < iDims ; ++j)
+        {
+            piIndex[j] = i;
+        }
+
+        int index = _pR->getIndex(piIndex);
+        sub(dblLeft, _pR->get(index), pOut->get() + index);
+    }
+
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_I_MC(T *_pL, U *_pR)
+{
+    int iDims = _pR->getDims();
+    int* piDims = _pR->getDimsArray();
+    O* pOut = (O*)opposite_MC<U, O>(_pR);
+    double* pdblOut = pOut->get();
+    double* pdblRight = _pR->get();
+    double dblLeft = _pL->get(0);
+    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];
+        }
+    }
+
+    for (int i = 0 ; i < iLeadDims ; ++i)
+    {
+        for (int j = 0 ; j < iDims ; ++j)
+        {
+            piIndex[j] = i;
+        }
+
+        int index = _pR->getIndex(piIndex);
+        sub(dblLeft, pdblRight[index], pdblOut + index);
+    }
+
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_IC_M(T *_pL, U *_pR)
+{
+    int iDims = _pR->getDims();
+    int* piDims = _pR->getDimsArray();
+    O* pOut = (O*)opposite_M<U, O>(_pR);
+    pOut->setComplex(true);
+    double* pdblOutR = pOut->get();
+    double* pdblOutI = pOut->getImg();
+    double* pdblRight = _pR->get();
+    double dblLeftR = _pL->get(0);
+    double dblLeftI = _pL->getImg(0);
+    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];
+        }
+    }
+
+    for (int i = 0 ; i < iLeadDims ; ++i)
+    {
+        for (int j = 0 ; j < iDims ; ++j)
+        {
+            piIndex[j] = i;
+        }
+
+        int index = _pR->getIndex(piIndex);
+        sub(&dblLeftR, &dblLeftI, 1, pdblRight[index], pdblOutR + index, pdblOutI + index);
+    }
+
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_IC_MC(T *_pL, U *_pR)
+{
+    int iDims = _pR->getDims();
+    int* piDims = _pR->getDimsArray();
+    O* pOut = (O*)opposite_MC<U, O>(_pR);
+    double dblLeftR = _pL->get(0);
+    double dblLeftI = _pL->getImg(0);
+    double* pdblOutR = pOut->get();
+    double* pdblOutI = pOut->getImg();
+    double* pdblRightR = _pR->get();
+    double* pdblRightI = _pR->getImg();
+    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];
+        }
+    }
+
+    for (int i = 0 ; i < iLeadDims ; ++i)
+    {
+        for (int j = 0 ; j < iDims ; ++j)
+        {
+            piIndex[j] = i;
+        }
+
+        int index = _pR->getIndex(piIndex);
+        sub(dblLeftR, dblLeftI, pdblRightR[index], pdblRightI[index], pdblOutR + index, pdblOutI + index);
+    }
+
+    return pOut;
+}
+
+template<class T, class U, class O>
+InternalType* sub_I_S(T *_pL, U *_pR)
+{
+    return sub_S_S<T, U, O>(_pL, _pR);
+}
+
+template<class T, class U, class O>
+InternalType* sub_IC_S(T *_pL, U *_pR)
+{
+    return sub_SC_S<T, U, O>(_pL, _pR);
+}
+
+template<class T, class U, class O>
+InternalType* sub_I_SC(T *_pL, U *_pR)
+{
+    return sub_S_SC<T, U, O>(_pL, _pR);
+}
+
+template<class T, class U, class O>
+InternalType* sub_IC_SC(T *_pL, U *_pR)
+{
+    return sub_SC_SC<T, U, O>(_pL, _pR);
+}
+
+template<class T, class U, class O> InternalType* sub_M_I(T *_pL, U *_pR)
+{
+    int iDims = _pL->getDims();
+    int* piDims = _pL->getDimsArray();
+    O* pOut = (O*)_pL->clone();
+    double* pdblOutR = pOut->get();
+    double* pdblLeft = _pL->get();
+    double dblRight = _pR->get(0);
+    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];
+        }
+    }
+
+    for (int i = 0 ; i < iLeadDims ; ++i)
+    {
+        for (int j = 0 ; j < iDims ; ++j)
+        {
+            piIndex[j] = i;
+        }
+
+        int index = _pL->getIndex(piIndex);
+        sub(pdblLeft[index], 1, &dblRight, pdblOutR + index);
+    }
+
+    return pOut;
+}
+
+template<class T, class U, class O> InternalType* sub_MC_I(T *_pL, U *_pR)
+{
+    return sub_M_I<T, U, O>(_pL, _pR);
+}
+
+template<class T, class U, class O> InternalType* sub_M_IC(T *_pL, U *_pR)
+{
+    int iDims = _pL->getDims();
+    int* piDims = _pL->getDimsArray();
+    O* pOut = (O*)_pL->clone();
+    pOut->setComplex(true);
+    double* pdblOutR = pOut->get();
+    double* pdblOutI = pOut->getImg();
+    double* pdblLeft = _pL->get();
+    double dblRightR = _pR->get(0);
+    double dblRightI = _pR->getImg(0);
+    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];
+        }
+    }
+
+    for (int i = 0 ; i < iLeadDims ; ++i)
+    {
+        for (int j = 0 ; j < iDims ; ++j)
+        {
+            piIndex[j] = i;
+        }
+
+        int index = _pL->getIndex(piIndex);
+        sub(pdblLeft[index], 1, &dblRightR, &dblRightI, pdblOutR + index, pdblOutI + index);
+    }
+
+    return pOut;
+}
+
+template<class T, class U, class O> InternalType* sub_MC_IC(T *_pL, U *_pR)
+{
+    int iDims = _pL->getDims();
+    int* piDims = _pL->getDimsArray();
+    O* pOut = (O*)_pL->clone();
+    pOut->setComplex(true);
+    double* pdblOutR = pOut->get();
+    double* pdblOutI = pOut->getImg();
+    double* pdblLeftR = _pL->get();
+    double* pdblLeftI = _pL->getImg();
+    double dblRightR = _pR->get(0);
+    double dblRightI = _pR->getImg(0);
+    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];
+        }
+    }
+
+    for (int i = 0 ; i < iLeadDims ; ++i)
+    {
+        for (int j = 0 ; j < iDims ; ++j)
+        {
+            piIndex[j] = i;
+        }
+
+        int index = _pL->getIndex(piIndex);
+        sub(pdblLeftR[index], pdblLeftI[index], 1, &dblRightR, &dblRightI, pdblOutR + index, pdblOutI + index);
+    }
+
+    return pOut;
+}
+
+template<class T, class U, class O> InternalType* sub_S_I(T *_pL, U *_pR)
+{
+    return sub_S_S<T, U, O>(_pL, _pR);
+}
+
+template<class T, class U, class O> InternalType* sub_SC_I(T *_pL, U *_pR)
+{
+    return sub_SC_SC<T, U, O>(_pL, _pR);
+}
+
+template<class T, class U, class O> InternalType* sub_S_IC(T *_pL, U *_pR)
+{
+    return sub_S_SC<T, U, O>(_pL, _pR);
+}
+
+template<class T, class U, class O> InternalType* sub_SC_IC(T *_pL, U *_pR)
+{
+    return sub_SC_SC<T, U, O>(_pL, _pR);
+}
+
+template<class T, class U, class O> InternalType* sub_I_I(T *_pL, U *_pR)
+{
+    O* pOut = types::Double::Identity(-1, -1);
+    sub(_pL->get(0), _pR->get(0), pOut->get());
+    return pOut;
+}
+
+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());
+    return pOut;
+}
+
+template<class T, class U, class O> InternalType* sub_IC_I(T *_pL, U *_pR)
+{
+    O* pOut = types::Double::Identity(-1, -1);
+    pOut->setComplex(true);
+    sub(_pL->get(0), _pL->getImg(0), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O> InternalType* sub_IC_IC(T *_pL, U *_pR)
+{
+    O* pOut = types::Double::Identity(-1, -1);
+    pOut->setComplex(true);
+    sub(_pL->get(0), _pL->getImg(0), _pR->get(0), _pR->getImg(0), pOut->get(), pOut->getImg());
+    return pOut;
+}
+
+template<class T, class U, class O> types::InternalType* sub_I_E(T *_pL, U *_pR)
+{
+    return (O*)_pL;
+}
+
+template<class T, class U, class O> types::InternalType* sub_IC_E(T *_pL, U *_pR)
+{
+    return (O*)_pL;
+}
+
+template<class T, class U, class O> types::InternalType* sub_E_I(T *_pL, U *_pR)
+{
+    return opposite_I<U, O>(_pR);
+}
+
+template<class T, class U, class O> types::InternalType* sub_E_IC(T *_pL, U *_pR)
+{
+    return opposite_IC<U, O>(_pR);
+}
+
+template<> InternalType* sub_M_M<Polynom, Polynom, Polynom>(Polynom* _pL, Polynom* _pR)
+{
+    Polynom* pOut = NULL;
+    if (_pL->isScalar())
+    {
+        SinglePoly* p1Coef  = _pL->get(0);
+        int iRank1          = p1Coef->getRank();
+        int* pRank2         = new int[_pR->getSize()];
+        int* pRankOut       = new int[_pR->getSize()];
+
+        _pR->getRank(pRank2);
+        for (int i = 0 ; i < _pR->getSize() ; i++)
+        {
+            pRankOut[i] = std::max(iRank1, pRank2[i]);
+        }
+
+        pOut = new Polynom(_pR->getVariableName(), _pR->getDims(), _pR->getDimsArray(), pRankOut);
+        bool isOutComplex = _pL->isComplex() || _pR->isComplex();
+
+        //Result P1(0) - P2(i)
+        double* p1R = p1Coef->get();
+        if (isOutComplex)
+        {
+            double* p1I = p1Coef->getImg();
+            for (int i = 0 ; i < _pR->getSize() ; i++)
+            {
+                SinglePoly* p2Coef   = _pR->get(i);
+                double* p2R          = p2Coef->get();
+                double* p2I          = p2Coef->getImg();
+
+                SinglePoly* pOutCoef = pOut->get(i);
+                pOutCoef->setComplex(isOutComplex);
+                double* pOutR        = pOutCoef->get();
+                double* pOutI        = pOutCoef->getImg();
+
+                for (int j = 0 ; j < pRankOut[i] + 1 ; j++)
+                {
+                    if (j > iRank1)
+                    {
+                        pOutR[j] = - p2R[j];
+                        pOutI[j] = - (p2I ? p2I[j] : 0);
+                    }
+                    else if (j > pRank2[i])
+                    {
+                        pOutR[j] = p1R[j];
+                        pOutI[j] = (p1I ? p1I[j] : 0);
+                    }
+                    else
+                    {
+                        pOutR[j] = p1R[j] - p2R[j];
+                        pOutI[j] = (p1I ? p1I[j] : 0) - (p2I ? p2I[j] : 0);
+                    }
+                }
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < _pR->getSize() ; i++)
+            {
+                SinglePoly* p2Coef   = _pR->get(i);
+                double* p2R          = p2Coef->get();
+
+                SinglePoly* pOutCoef = pOut->get(i);
+                double* pOutR        = pOutCoef->get();
+
+                for (int j = 0 ; j < pRankOut[i] + 1 ; j++)
+                {
+                    if (j > iRank1)
+                    {
+                        pOutR[j] = - p2R[j];
+                    }
+                    else if (j > pRank2[i])
+                    {
+                        pOutR[j] = p1R[j];
+                    }
+                    else
+                    {
+                        pOutR[j] = p1R[j] - p2R[j];
+                    }
+                }
+            }
+        }
+
+        delete[] pRankOut;
+        delete[] pRank2;
+        pOut->updateRank();
+        return pOut;
+    }
+
+    if (_pR->isScalar())
+    {
+        //size(p2) == 1
+        int *pRank1     = new int[_pL->getSize()];
+        int iRank2      = _pR->get(0)->getRank();
+        int *pRankOut   = new int[_pL->getSize()];
+
+        _pL->getRank(pRank1);
+        for (int i = 0 ; i < _pL->getSize() ; i++)
+        {
+            pRankOut[i] = std::max(pRank1[i], iRank2);
+        }
+
+        pOut = new Polynom(_pL->getVariableName(), _pL->getDims(), _pL->getDimsArray(), pRankOut);
+        bool isOutComplex = _pL->isComplex() || _pR->isComplex();
+
+        //Result P1(i) - P2(0)
+        SinglePoly *p2Coef          = _pR->get(0);
+        double *p2R                 = p2Coef->get();
+
+        if (isOutComplex)
+        {
+            double *p2I             = p2Coef->getImg();
+            for (int i = 0 ; i < _pL->getSize() ; i++)
+            {
+                SinglePoly *p1Coef      = _pL->get(i);
+                double *p1R             = p1Coef->get();
+                double *p1I             = p1Coef->getImg();
+
+                SinglePoly *pOutCoef    = pOut->get(i);
+                pOutCoef->setComplex(isOutComplex);
+                double *pOutR           = pOutCoef->get();
+                double *pOutI           = pOutCoef->getImg();
+
+                for (int j = 0 ; j < pRankOut[i] + 1 ; j++)
+                {
+                    if (j > pRank1[j])
+                    {
+                        pOutR[j] = - p2R[j];
+                        pOutI[j] = - (p2I ? p2I[j] : 0);
+                    }
+                    else if (j > iRank2)
+                    {
+                        pOutR[j] = p1R[j];
+                        pOutI[j] = (p1I ? p1I[j] : 0);
+                    }
+                    else
+                    {
+                        pOutR[j] = p1R[j] - p2R[j];
+                        pOutI[j] = (p1I ? p1I[j] : 0) - (p2I ? p2I[j] : 0);
+                    }
+                }
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < _pL->getSize() ; i++)
+            {
+                SinglePoly *p1Coef      = _pL->get(i);
+                double *p1R             = p1Coef->get();
+
+                SinglePoly *pOutCoef    = pOut->get(i);
+                double *pOutR           = pOutCoef->get();
+
+                for (int j = 0 ; j < pRankOut[i] + 1 ; j++)
+                {
+                    if (j > pRank1[j])
+                    {
+                        pOutR[j] = - p2R[j];
+                    }
+                    else if (j > iRank2)
+                    {
+                        pOutR[j] = p1R[j];
+                    }
+                    else
+                    {
+                        pOutR[j] = p1R[j] - p2R[j];
+                    }
+                }
+            }
+        }
+
+        delete[] pRankOut;
+        delete[] pRank1;
+        pOut->updateRank();
+        return pOut;
+    }
+
+    //check dimension compatibilities
+    int iDims1  = _pL->getDims();
+    int iDims2  = _pR->getDims();
+
+    if (iDims1 != iDims2)
+    {
+        throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+    }
+
+    int* piDims1    = _pL->getDimsArray();
+    int* piDims2    = _pR->getDimsArray();
+
+    for (int i = 0 ; i < iDims1 ; i++)
+    {
+        if (piDims1[i] != piDims2[i])
+        {
+            throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+        }
+    }
+
+    int *pRankOut   = new int[_pL->getSize()];
+    int *pRank1     = new int[_pL->getSize()];
+    int *pRank2     = new int[_pR->getSize()];
+
+    _pL->getRank(pRank1);
+    _pR->getRank(pRank2);
+    for (int i = 0 ; i < _pL->getSize() ; i++)
+    {
+        pRankOut[i] = std::max(pRank1[i], pRank2[i]);
+    }
+
+    pOut = new Polynom(_pR->getVariableName(), iDims1, piDims1, pRankOut);
+    bool isOutComplex =  _pL->isComplex() || _pR->isComplex();
+
+    //Result P1(i) - P2(i)
+    for (int i = 0 ; i < _pL->getSize() ; i++)
+    {
+        SinglePoly* pOutCoef = pOut->get(i);
+        pOutCoef->setComplex(isOutComplex);
+
+        double *p1R     = _pL->get(i)->get();
+        double *p2R     = _pR->get(i)->get();
+        double *pOutR   = pOutCoef->get();
+        int iMin        = std::min(pRank1[i], pRank2[i]);
+        int iMax        = std::max(pRank1[i], pRank2[i]);
+
+        for (int j = 0 ; j < iMin + 1 ; j++)
+        {
+            pOutR[j]    = p1R[j] - p2R[j];
+        }
+
+        double *pTemp   = NULL;
+        int iCoef       = 1;
+        if (pRank1[i] > pRank2[i])
+        {
+            pTemp       = p1R;
+            iCoef       = 1;
+        }
+        else
+        {
+            pTemp       = p2R;
+            iCoef       = -1;
+        }
+
+        for (int j = iMin + 1 ; j < iMax + 1 ; j++)
+        {
+            pOutR[j]    = pTemp[j] * iCoef;
+        }
+
+        if (isOutComplex)
+        {
+            double *p1I     = _pL->get(i)->getImg();
+            double *p2I     = _pR->get(i)->getImg();
+            double *pOutI   = pOutCoef->getImg();
+
+            for (int j = 0 ; j < iMin + 1 ; j++)
+            {
+                pOutI[j]    = (p1I == NULL ? 0 : p1I[j]) - (p2I == NULL ? 0 : p2I[j]);
+            }
+
+            for (int j = iMin + 1 ; j < iMax + 1 ; j++)
+            {
+                pOutI[j]  = pTemp[j] * iCoef;
+            }
+        }
+    }
+
+    delete[] pRankOut;
+    delete[] pRank1;
+    delete[] pRank2;
+
+    pOut->updateRank();
+    return pOut;
+}
+
+// P - D
+template<> InternalType* sub_M_M<Polynom, Double, Polynom>(Polynom* _pL, Double* _pR)
+{
+    Polynom* pOut = NULL;
+
+    bool bComplex1 = _pL->isComplex();
+    bool bComplex2 = _pR->isComplex();
+    bool isComplexOut = bComplex2 || bComplex1;
+
+    // P - []
+    if (_pR->isEmpty())
+    {
+        return _pL;
+    }
+
+    if (_pR->isIdentity())
+    {
+        double dblRightR = _pR->get(0);
+        double dblRightI = 0;
+        if (_pR->isComplex())
+        {
+            dblRightI = _pR->getImg(0);
+        }
+
+        int iDims = _pL->getDims();
+        int* piDims = _pL->getDimsArray();
+        pOut = (Polynom*)_pL->clone();
+        pOut->setComplex(isComplexOut);
+        SinglePoly** pSPOut = pOut->get();
+        SinglePoly** pSPLeft = _pL->get();
+        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];
+            }
+        }
+
+        if (isComplexOut)
+        {
+            for (int i = 0 ; i < iLeadDims ; ++i)
+            {
+                for (int j = 0 ; j < iDims ; ++j)
+                {
+                    piIndex[j] = i;
+                }
+
+                int index = _pL->getIndex(piIndex);
+                sub(pSPLeft[index]->get(0), pSPLeft[index]->getImg(0), 1, &dblRightR, &dblRightI, pSPOut[index]->get(), pSPOut[index]->getImg());
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < iLeadDims ; ++i)
+            {
+                for (int j = 0 ; j < iDims ; ++j)
+                {
+                    piIndex[j] = i;
+                }
+
+                int index = _pL->getIndex(piIndex);
+                sub(pSPLeft[index]->get(0), 1, &dblRightR, pSPOut[index]->get());
+            }
+        }
+        return pOut;
+
+    }
+
+    if (_pR->isScalar())
+    {
+        //subtract same value to all polynoms
+        pOut = (Polynom*)_pL->clone();
+        pOut->setComplex(isComplexOut);
+
+        SinglePoly** pSP = pOut->get();
+        int iSize = pOut->getSize();
+
+        double dblR = _pR->get(0);
+        if (isComplexOut)
+        {
+            double dblI = _pR->getImg(0);
+            for (int i = 0 ; i < iSize ; ++i)
+            {
+                pSP[i]->get()[0] -= dblR;
+                pSP[i]->getImg()[0] -= dblI;
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < iSize ; ++i)
+            {
+                pSP[i]->get()[0] -= dblR;
+            }
+        }
+
+        return pOut;
+    }
+
+    if (_pL->isScalar())
+    {
+        //and _pR is not !
+        int iDims = _pR->getDims();
+        int* piDims = _pR->getDimsArray();
+        int iSize = _pR->getSize();
+
+        pOut = new Polynom(_pL->getVariableName(), iDims, piDims);
+
+        SinglePoly* pSPL = _pL->get(0);
+        if (_pR->isComplex())
+        {
+            double* pdblR = _pR->get();
+            double* pdblI = _pR->getImg();
+
+            for (int i = 0 ; i < iSize ; ++i)
+            {
+                SinglePoly* pSPOut = pSPL->clone();
+                //in case of original is not complex
+                pSPOut->setComplex(isComplexOut);
+                pSPOut->get()[0] -= pdblR[i];
+                pSPOut->getImg()[0] -= pdblI[i];
+                pOut->set(i, pSPOut);
+            }
+        }
+        else
+        {
+            double* pdblR = _pR->get();
+
+            for (int i = 0 ; i < iSize ; ++i)
+            {
+                SinglePoly* pSPOut = pSPL->clone();
+                //update 0th rank value
+                pSPOut->get()[0] -= pdblR[i];
+                pOut->set(i, pSPOut);
+            }
+        }
+
+        return pOut;
+    }
+
+    //P - D
+
+    //check dimensions
+    int iDims1 = _pR->getDims();
+    int iDims2 = _pL->getDims();
+
+    if (iDims1 != iDims2)
+    {
+        wchar_t pMsg[bsiz];
+        os_swprintf(pMsg, bsiz, _W("Error: operator %ls: Matrix dimensions must agree (op1 is %ls, op2 is %ls).\n").c_str(),  L"-", _pL->DimToString().c_str(), _pR->DimToString().c_str());
+        throw ast::ScilabError(pMsg);
+    }
+
+    int* piDims1 = _pR->getDimsArray();
+    int* piDims2 = _pL->getDimsArray();
+
+    for (int i = 0 ; i < iDims1 ; i++)
+    {
+        if (piDims1[i] != piDims2[i])
+        {
+            wchar_t pMsg[bsiz];
+            os_swprintf(pMsg, bsiz, _W("Error: operator %ls: Matrix dimensions must agree (op1 is %ls, op2 is %ls).\n").c_str(),  L"-", _pL->DimToString().c_str(), _pR->DimToString().c_str());
+            throw ast::ScilabError(pMsg);
+        }
+    }
+
+    double* pInDblR = _pR->get();
+    pOut = (Polynom*)_pL->clone();
+    if (bComplex1 && bComplex2)
+    {
+        double* pInDblI = _pR->getImg();
+        for (int i = 0 ; i < pOut->getSize() ; i++)
+        {
+            SinglePoly *pSPOut   = pOut->get(i);
+            double *pOutPolyR    = pSPOut->get();
+            double *pOutPolyI    = pSPOut->getImg();
+
+            pOutPolyR[0] -= pInDblR[i];
+            pOutPolyI[0] -= pInDblI[i];
+        }
+    }
+    else if (bComplex2)
+    {
+        double* pInDblI = _pR->getImg();
+        pOut->setComplex(true);
+        for (int i = 0 ; i < pOut->getSize() ; i++)
+        {
+            SinglePoly *pSPOut   = pOut->get(i);
+            double *pOutPolyR    = pSPOut->get();
+            double *pOutPolyI    = pSPOut->getImg();
+
+            pOutPolyR[0] -= pInDblR[i];
+            pOutPolyI[0] = -pInDblI[i];
+        }
+    }
+    else
+    {
+        for (int i = 0 ; i < pOut->getSize() ; i++)
+        {
+            SinglePoly *pSPOut = pOut->get(i);
+            double *pOutPolyR  = pSPOut->get();
+
+            pOutPolyR[0] -= pInDblR[i];
+        }
+    }
+
+    return pOut;
+}
+
+template<> InternalType* sub_I_M<Double, Polynom, Polynom>(Double* _pL, Polynom* _pR)
+{
+    Polynom* pOut = (Polynom*)opposite_M<Polynom, Polynom>(_pR);
+    double dblLeft = _pL->get(0);
+
+    int iDims = _pR->getDims();
+    int* piDims = _pR->getDimsArray();
+    int iSize = _pR->getSize();
+    int iLeadDims = piDims[0];
+    int* piIndex = new int[iDims];
+    SinglePoly** pSP = _pR->get();
+    SinglePoly** pSPOut = pOut->get();
+    piIndex[0] = 0;
+
+    //find smaller dims
+    for (int i = 1 ; i < iDims ; ++i)
+    {
+        //init
+        piIndex[i] = 0;
+
+        if (iLeadDims > piDims[i])
+        {
+            iLeadDims = piDims[i];
+        }
+    }
+
+    for (int i = 0 ; i < iLeadDims ; ++i)
+    {
+        for (int j = 0 ; j < iDims ; ++j)
+        {
+            piIndex[j] = i;
+        }
+
+        int index = _pR->getIndex(piIndex);
+        sub(dblLeft, pSP[index]->get(0), pSPOut[index]->get());
+    }
+
+    return pOut;
+}
+
+template<> InternalType* sub_I_MC<Double, Polynom, Polynom>(Double* _pL, Polynom* _pR)
+{
+    Polynom* pOut = (Polynom*)opposite_MC<Polynom, Polynom>(_pR);
+    double dblLeft = _pL->get(0);
+
+    int iDims = _pR->getDims();
+    int* piDims = _pR->getDimsArray();
+    int iSize = _pR->getSize();
+    int iLeadDims = piDims[0];
+    int* piIndex = new int[iDims];
+    SinglePoly** pSP = _pR->get();
+    SinglePoly** pSPOut = pOut->get();
+    piIndex[0] = 0;
+
+    for (int i = 0 ; i < iDims ; ++i)
+    {
+        //init
+        piIndex[i] = 0;
+
+        if (iLeadDims > piDims[i])
+        {
+            iLeadDims = piDims[i];
+        }
+    }
+
+    for (int i = 0 ; i < iLeadDims ; ++i)
+    {
+        for (int j = 0 ; j < iDims ; ++j)
+        {
+            piIndex[j] = i;
+        }
+
+        int index = _pR->getIndex(piIndex);
+        sub(dblLeft, pSP[index]->get(0), pSPOut[index]->get());
+    }
+
+    return pOut;
+}
+
+template<> InternalType* sub_IC_M<Double, Polynom, Polynom>(Double* _pL, Polynom* _pR)
+{
+    Polynom* pOut = (Polynom*)opposite_M<Polynom, Polynom>(_pR);
+    pOut->setComplex(true);
+    double dblLeftR = _pL->get(0);
+    double dblLeftI = _pL->getImg(0);
+
+    int iDims = _pR->getDims();
+    int* piDims = _pR->getDimsArray();
+    int iSize = _pR->getSize();
+    int iLeadDims = piDims[0];
+    int* piIndex = new int[iDims];
+    SinglePoly** pSP = _pR->get();
+    SinglePoly** pSPOut = pOut->get();
+    piIndex[0] = 0;
+
+    for (int i = 0 ; i < iDims ; ++i)
+    {
+        //init
+        piIndex[i] = 0;
+
+        if (iLeadDims > piDims[i])
+        {
+            iLeadDims = piDims[i];
+        }
+    }
+
+    for (int i = 0 ; i < iLeadDims ; ++i)
+    {
+        for (int j = 0 ; j < iDims ; ++j)
+        {
+            piIndex[j] = i;
+        }
+
+        int index = _pR->getIndex(piIndex);
+        sub(&dblLeftR, &dblLeftI, 1, pSP[index]->get(0), pSPOut[index]->get(), pSPOut[index]->getImg());
+    }
+
+    return pOut;
+}
+
+template<> InternalType* sub_IC_MC<Double, Polynom, Polynom>(Double* _pL, Polynom* _pR)
+{
+    Polynom* pOut = (Polynom*)opposite_MC<Polynom, Polynom>(_pR);
+    double dblLeftR = _pL->get(0);
+    double dblLeftI = _pL->getImg(0);
+
+    int iDims = _pR->getDims();
+    int* piDims = _pR->getDimsArray();
+    int iSize = _pR->getSize();
+    int iLeadDims = piDims[0];
+    int* piIndex = new int[iDims];
+    SinglePoly** pSP = _pR->get();
+    SinglePoly** pSPOut = pOut->get();
+    piIndex[0] = 0;
+
+    for (int i = 0 ; i < iDims ; ++i)
+    {
+        //init
+        piIndex[i] = 0;
+
+        if (iLeadDims > piDims[i])
+        {
+            iLeadDims = piDims[i];
+        }
+    }
+
+    for (int i = 0 ; i < iLeadDims ; ++i)
+    {
+        for (int j = 0 ; j < iDims ; ++j)
+        {
+            piIndex[j] = i;
+        }
+
+        int index = _pR->getIndex(piIndex);
+        sub(dblLeftR, dblLeftI, pSP[index]->get(0), pSP[index]->getImg(0), pSPOut[index]->get(), pSPOut[index]->getImg());
+    }
+
+    return pOut;
+}
+
+template<> InternalType* sub_M_M<Double, Polynom, Polynom>(Double* _pL, Polynom* _pR)
+{
+    Polynom* pOut = NULL;
+    bool bComplex1 = _pR->isComplex();
+    bool bComplex2 = _pL->isComplex();
+
+    double *pInDblR = _pL->getReal();
+    double *pInDblI = _pL->getImg();
+
+    if (_pL->isEmpty())
+    {
+        return _pR;
+    }
+
+    if (_pR->isScalar())
+    {
+        int *piRank = new int[_pL->getSize()];
+        for (int i = 0 ; i < _pL->getSize() ; i++)
+        {
+            piRank[i] = _pR->get(0)->getRank();
+        }
+
+        pOut = new Polynom(_pR->getVariableName(), _pL->getDims(), _pL->getDimsArray(), piRank);
+        if (bComplex1 || bComplex2)
+        {
+            pOut->setComplex(true);
+        }
+
+        for (int i = 0 ; i < pOut->getSize() ; i++)
+        {
+            SinglePoly *pInPoly  = _pR->get(0);
+            SinglePoly *pOutPoly = pOut->get(i);
+            double *pInPolyR     = pInPoly->get();
+            double *pOutPolyR    = pOutPoly->get();
+
+            pOutPolyR[0] = pInDblR[i] - pInPolyR[0];
+
+            for (int j = 1 ; j < pInPoly->getSize() ; j++)
+            {
+                pOutPolyR[j] = -pInPolyR[j];
+            }
+        }
+
+        if (pOut->isComplex())
+        {
+            for (int i = 0 ; i < pOut->getSize() ; i++)
+            {
+                SinglePoly *pInPoly  = _pR->get(0);
+                SinglePoly *pOutPoly = pOut->get(i);
+                double *pInPolyI     = pInPoly->getImg();
+                double *pOutPolyI    = pOutPoly->getImg();
+
+                pOutPolyI[0] = (pInDblI != NULL ? pInDblI[i] : 0) - (pInPolyI != NULL ? pInPolyI[0] : 0);
+
+                for (int j = 1 ; j < pInPoly->getSize() ; j++)
+                {
+                    pOutPolyI[j] = (pInPolyI != NULL ? -pInPolyI[j] : 0);
+                }
+            }
+        }
+
+        return pOut;
+    }
+
+    if (_pL->isScalar())
+    {
+        pOut = (Polynom*)_pR->clone();
+
+        if (bComplex1 && bComplex2)
+        {
+            for (int i = 0 ; i < pOut->getSize() ; i++)
+            {
+                SinglePoly *pSPOut   = pOut->get(i);
+                double *pOutPolyR    = pSPOut->get();
+                double *pOutPolyI    = pSPOut->getImg();
+
+                pOutPolyR[0] += pInDblR[0];
+                pOutPolyI[0] += pInDblI[0];
+            }
+        }
+        else if (bComplex2)
+        {
+            pOut->setComplex(true);
+            for (int i = 0 ; i < pOut->getSize() ; i++)
+            {
+                SinglePoly *pSPOut   = pOut->get(i);
+                double *pOutPolyR    = pSPOut->get();
+                double *pOutPolyI    = pSPOut->getImg();
+
+                pOutPolyR[0] += pInDblR[0];
+                pOutPolyI[0] = pInDblI[0];
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < pOut->getSize() ; i++)
+            {
+                SinglePoly *pSPOut = pOut->get(i);
+                double *pOutPolyR  = pSPOut->get();
+
+                pOutPolyR[0] += pInDblR[0];
+            }
+        }
+
+        return pOut;
+    }
+
+    int iDims1 = _pR->getDims();
+    int iDims2 = _pL->getDims();
+
+    if (iDims1 != iDims2)
+    {
+        wchar_t pMsg[bsiz];
+        os_swprintf(pMsg, bsiz, _W("Error: operator %ls: Matrix dimensions must agree (op1 is %ls, op2 is %ls).\n").c_str(),  L"+", _pL->DimToString().c_str(), _pR->DimToString().c_str());
+        throw ast::ScilabError(pMsg);
+    }
+
+    int* piDims1 = _pR->getDimsArray();
+    int* piDims2 = _pL->getDimsArray();
+
+    for (int i = 0 ; i < iDims1 ; i++)
+    {
+        if (piDims1[i] != piDims2[i])
+        {
+            wchar_t pMsg[bsiz];
+            os_swprintf(pMsg, bsiz, _W("Error: operator %ls: Matrix dimensions must agree (op1 is %ls, op2 is %ls).\n").c_str(),  L"+", _pL->DimToString().c_str(), _pR->DimToString().c_str());
+            throw ast::ScilabError(pMsg);
+        }
+    }
+
+    pOut = (Polynom*)_pR->clone();
+    if (bComplex1 && bComplex2)
+    {
+        for (int i = 0 ; i < pOut->getSize() ; i++)
+        {
+            SinglePoly *pSPOut   = pOut->get(i);
+            double *pOutPolyR    = pSPOut->get();
+            double *pOutPolyI    = pSPOut->getImg();
+
+            pOutPolyR[0] += pInDblR[i];
+            pOutPolyI[0] += pInDblI[i];
+        }
+    }
+    else if (bComplex2)
+    {
+        pOut->setComplex(true);
+        for (int i = 0 ; i < pOut->getSize() ; i++)
+        {
+            SinglePoly *pSPOut   = pOut->get(i);
+            double *pOutPolyR    = pSPOut->get();
+            double *pOutPolyI    = pSPOut->getImg();
+
+            pOutPolyR[0] += pInDblR[i];
+            pOutPolyI[0] = pInDblI[i];
+        }
+    }
+    else
+    {
+        for (int i = 0 ; i < pOut->getSize() ; i++)
+        {
+            SinglePoly *pSPOut = pOut->get(i);
+            double *pOutPolyR  = pSPOut->get();
+
+            pOutPolyR[0] += pInDblR[i];
+        }
+    }
+
+    return pOut;
+}
+
+//sp - sp
+template<> InternalType* sub_M_M<Sparse, Sparse, Sparse>(Sparse* _pL, Sparse* _pR)
+{
+    Sparse* pOut = NULL;
+    //check scalar hidden in a sparse ;)
+    if (_pL->getRows() == 1 && _pL->getCols() == 1)
+    {
+        //do scalar - sp
+        Double* pDbl = NULL;
+        if (_pL->isComplex())
+        {
+            std::complex<double> dbl = _pL->getImg(0, 0);
+            pDbl = new Double(dbl.real(), dbl.imag());
+        }
+        else
+        {
+            pDbl = new Double(_pL->get(0, 0));
+        }
+
+        //AddSparseToDouble(_pR, pDbl, (GenericType**)pOut);
+        delete pDbl;
+        return pOut;
+    }
+
+    if (_pR->getRows() == 1 && _pR->getCols() == 1)
+    {
+        //do sp - scalar
+        Double* pDbl = NULL;
+        if (_pR->isComplex())
+        {
+            std::complex<double> dbl = _pR->getImg(0, 0);
+            pDbl = new Double(dbl.real(), dbl.imag());
+        }
+        else
+        {
+            pDbl = new Double(_pR->get(0, 0));
+        }
+
+        //AddSparseToDouble(_pL, pDbl, (GenericType**)pOut);
+        delete pDbl;
+        return 0;
+    }
+
+    if (_pL->getRows() != _pR->getRows() || _pL->getCols() != _pR->getCols())
+    {
+        //dimensions not match
+        throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+    }
+
+    if (_pL->nonZeros() == 0)
+    {
+        //sp([]) - sp
+        return _pR;
+    }
+
+    if (_pR->nonZeros() == 0)
+    {
+        //sp - sp([])
+        return _pL;
+    }
+
+    return _pL->substract(*_pR);
+}
+
+//d - sp
+template<> InternalType* sub_M_M<Double, Sparse, Double>(Double* _pL, Sparse* _pR)
+{
+    Double* pOut = NULL;
+    int iOne = 1; //fortran
+    bool bComplex1 = _pL->isComplex();
+    bool bComplex2 = _pR->isComplex();
+
+    if (_pL->isScalar() && _pR->isScalar())
+    {
+        //d - sp
+        pOut = (Double*)_pL->clone();
+        pOut->setComplex(bComplex1 | bComplex2);
+        if (bComplex2)
+        {
+            std::complex<double> dbl = _pR->getImg(0, 0);
+            pOut->set(0, dbl.real() - pOut->get(0));
+            pOut->setImg(0, pOut->getImg(0) - dbl.imag());
+        }
+        else
+        {
+            pOut->set(0, pOut->get(0) - _pL->get(0, 0));
+        }
+
+        return pOut;
+    }
+
+    if (_pL->isScalar())
+    {
+        //d - SP
+        pOut = new Double(_pR->getRows(), _pR->getCols(), bComplex1 | bComplex2);
+        int iSize = _pR->getSize();
+        double dblVal = _pL->get(0);
+        double dblValI = 0;
+        C2F(dset)(&iSize, &dblVal, pOut->get(), &iOne);
+        if (bComplex1)
+        {
+            //initialize imag part at 0
+            dblValI = _pL->getImg(0);
+            C2F(dset)(&iSize, &dblValI, pOut->getImg(), &iOne);
+        }
+        else if (bComplex2)
+        {
+            dblValI = 0;
+            C2F(dset)(&iSize, &dblValI, pOut->getImg(), &iOne);
+        }
+
+        int nonZeros = static_cast<int>(_pR->nonZeros());
+        int* pRows = new int[nonZeros * 2];
+        _pR->outputRowCol(pRows);
+        int* pCols = pRows + nonZeros;
+
+        if (pOut->isComplex())
+        {
+            for (int i = 0 ; i < nonZeros ; i++)
+            {
+                int iRow = static_cast<int>(pRows[i]) - 1;
+                int iCol = static_cast<int>(pCols[i]) - 1;
+                std::complex<double> dbl = _pR->getImg(iRow, iCol);
+                pOut->set(iRow, iCol, dblVal - dbl.real());
+                pOut->setImg(iRow, iCol, dblValI - dbl.imag());
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < nonZeros ; i++)
+            {
+                int iRow = static_cast<int>(pRows[i]) - 1;
+                int iCol = static_cast<int>(pCols[i]) - 1;
+                pOut->set(iRow, iCol, dblVal - _pR->get(iRow, iCol));
+            }
+        }
+
+        //clear
+        delete[] pRows;
+
+        return pOut;
+    }
+
+    if (_pL->isScalar())
+    {
+        //D - sp
+        pOut = (Double*)_pR->clone();
+        pOut->setComplex(bComplex1 | bComplex2);
+
+        if (pOut->isComplex())
+        {
+            double* pReal = pOut->get();
+            double* pImg = pOut->getImg();
+            int size = pOut->getSize();
+            for (int i = 0 ; i < size ; i++)
+            {
+                std::complex<double> dbl = _pR->getImg(0, 0);
+                pReal[i] -= dbl.real();
+                pImg[i] -= dbl.imag();
+            }
+        }
+        else
+        {
+            double* pReal = pOut->get();
+            int size = pOut->getSize();
+            for (int i = 0 ; i < size ; i++)
+            {
+                pReal[i] -= pReal[i];
+            }
+        }
+
+        return pOut;
+    }
+
+
+    if (_pL->getRows() == _pR->getRows() && _pL->getCols() == _pR->getCols())
+    {
+        //D - SP
+        pOut = (Double*)_pL->clone();
+        pOut->setComplex(bComplex1 | bComplex2);
+
+        int nonZeros = static_cast<int>(_pR->nonZeros());
+        int* pRows = new int[nonZeros * 2];
+        _pR->outputRowCol(pRows);
+        int* pCols = pRows + nonZeros;
+
+        if (bComplex1)
+        {
+            for (int i = 0 ; i < nonZeros ; i++)
+            {
+                int iRow = static_cast<int>(pRows[i]) - 1;
+                int iCol = static_cast<int>(pCols[i]) - 1;
+                std::complex<double> dbl = _pR->getImg(iRow, iCol);
+                pOut->set(iRow, iCol, pOut->get(iRow, iCol) - dbl.real());
+                pOut->setImg(iRow, iCol, pOut->getImg(iRow, iCol) - dbl.imag());
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < nonZeros ; i++)
+            {
+                int iRow = static_cast<int>(pRows[i]) - 1;
+                int iCol = static_cast<int>(pCols[i]) - 1;
+                pOut->set(iRow, iCol, pOut->get(iRow, iCol) - _pR->get(iRow, iCol));
+            }
+        }
+
+        //clear
+        delete[] pRows;
+        return pOut;
+    }
+    else
+    {
+        throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+    }
+}
+
+//sp - d
+template<> InternalType* sub_M_M<Sparse, Double, Double>(Sparse* _pL, Double* _pR)
+{
+    Double* pOut = NULL;
+    int iOne = 1; //fortran
+    bool bComplex1 = _pL->isComplex();
+    bool bComplex2 = _pR->isComplex();
+
+    if (_pL->isScalar() && _pR->isScalar())
+    {
+        //sp - d
+        pOut = (Double*)_pR->clone();
+        pOut->setComplex(bComplex1 | bComplex2);
+        if (bComplex1)
+        {
+            std::complex<double> dbl = _pL->getImg(0, 0);
+            pOut->set(0, pOut->get(0) - dbl.real());
+            pOut->setImg(0, dbl.imag() - pOut->getImg(0));
+        }
+        else
+        {
+            pOut->set(0, _pL->get(0, 0) - pOut->get(0));
+        }
+
+        return pOut;
+    }
+
+    if (_pR->isScalar())
+    {
+        //SP - d
+        pOut = new Double(_pL->getRows(), _pL->getCols(), bComplex1 | bComplex2);
+        int iSize = _pL->getSize();
+        double dblVal = -_pR->get(0);
+        double dblValI = 0;
+        C2F(dset)(&iSize, &dblVal, pOut->get(), &iOne);
+        if (bComplex2)
+        {
+            dblValI = -_pR->getImg(0);
+            C2F(dset)(&iSize, &dblValI, pOut->getImg(), &iOne);
+        }
+        else if (bComplex1)
+        {
+            //initialize imag part at 0
+            dblValI = 0;
+            C2F(dset)(&iSize, &dblValI, pOut->getImg(), &iOne);
+        }
+
+        int nonZeros = static_cast<int>(_pL->nonZeros());
+        int* pRows = new int[nonZeros * 2];
+        _pL->outputRowCol(pRows);
+        int* pCols = pRows + nonZeros;
+
+        if (bComplex1)
+        {
+            for (int i = 0 ; i < nonZeros ; i++)
+            {
+                int iRow = static_cast<int>(pRows[i]) - 1;
+                int iCol = static_cast<int>(pCols[i]) - 1;
+                std::complex<double> dbl = _pL->getImg(iRow, iCol);
+                pOut->set(iRow, iCol, dbl.real() - (-dblVal));
+                pOut->setImg(iRow, iCol, dbl.imag() - (-dblValI));
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < nonZeros ; i++)
+            {
+                int iRow = static_cast<int>(pRows[i]) - 1;
+                int iCol = static_cast<int>(pCols[i]) - 1;
+                pOut->set(iRow, iCol, _pL->get(iRow, iCol) - (-dblVal));
+            }
+        }
+
+        //clear
+        delete[] pRows;
+
+        return pOut;
+    }
+
+    if (_pL->isScalar())
+    {
+        //sp - D
+        pOut = (Double*)_pR->clone();
+        pOut->setComplex(bComplex1 | bComplex2);
+
+        if (bComplex1)
+        {
+            double* pReal = pOut->get();
+            double* pImg = pOut->getImg();
+            int size = pOut->getSize();
+            for (int i = 0 ; i < size ; i++)
+            {
+                std::complex<double> dbl = _pL->getImg(0, 0);
+                pReal[i] = dbl.real() - pReal[i];
+                pImg[i] = dbl.imag() - pImg[i];
+            }
+        }
+        else
+        {
+            double* pReal = pOut->get();
+            int size = pOut->getSize();
+            for (int i = 0 ; i < size ; i++)
+            {
+                pReal[i] = _pL->get(0, 0) - pReal[i];
+            }
+        }
+
+        return pOut;
+    }
+
+
+    if (_pL->getRows() == _pR->getRows() && _pL->getCols() == _pR->getCols())
+    {
+        //SP - D
+        pOut = (Double*)_pR->clone();
+        pOut->setComplex(bComplex1 | bComplex2);
+
+        int nonZeros = static_cast<int>(_pL->nonZeros());
+        int* pRows = new int[nonZeros * 2];
+        _pL->outputRowCol(pRows);
+        int* pCols = pRows + nonZeros;
+
+        if (bComplex1)
+        {
+            for (int i = 0 ; i < nonZeros ; i++)
+            {
+                int iRow = static_cast<int>(pRows[i]) - 1;
+                int iCol = static_cast<int>(pCols[i]) - 1;
+                std::complex<double> dbl = _pL->getImg(iRow, iCol);
+                pOut->set(iRow, iCol, dbl.real() - pOut->get(iRow, iCol));
+                pOut->setImg(iRow, iCol, dbl.imag() - pOut->getImg(iRow, iCol));
+            }
+        }
+        else
+        {
+            for (int i = 0 ; i < nonZeros ; i++)
+            {
+                int iRow = static_cast<int>(pRows[i]) - 1;
+                int iCol = static_cast<int>(pCols[i]) - 1;
+                pOut->set(iRow, iCol, _pL->get(iRow, iCol) - pOut->get(iRow, iCol));
+            }
+        }
+
+        //clear
+        delete[] pRows;
+        return pOut;
+    }
+    else
+    {
+        throw ast::ScilabError(_W("Inconsistent row/column dimensions.\n"));
+    }
+}
+
+//[] - sp
+template<> InternalType* sub_M_M<Double, Sparse, Sparse>(Double* _pL, Sparse* _pR)
+{
+    return sub_M_M<Sparse, Double, Sparse>(_pR, _pL);
+}
+
+//sp - []
+template<> InternalType* sub_M_M<Sparse, Double, Sparse>(Sparse* _pL, Double* _pR)
+{
+    Sparse* pOut = NULL;
+    if (_pR->isIdentity())
+    {
+        //convert to _pL
+        Sparse* pS = new Sparse(_pL->getRows(), _pL->getCols(), _pR->isComplex());
+        if (pS->isComplex())
+        {
+            int size = std::min(_pL->getRows(), _pL->getCols());
+            for (int i = 0 ; i < size ; i++)
+            {
+                pS->set(i, i, std::complex<double>(_pR->get(0), _pR->getImg(0)));
+            }
+        }
+        else
+        {
+            int size = std::min(_pL->getRows(), _pL->getCols());
+            for (int i = 0 ; i < size ; i++)
+            {
+                pS->set(i, i, _pR->get(0));
+            }
+        }
+
+        //AddSparseToSparse(_pL, pS, (Sparse**)pOut);
+        delete pS;
+        return pOut;
+    }
+    else
+    {
+        //is []
+        return _pL;
+    }
+}
index 9758df4..7ac5b73 100644 (file)
@@ -22,7 +22,7 @@
 #include "tostring_common.hxx"
 #include "double.hxx"
 #include "matrixiterator.hxx"
-#include "types_substraction.hxx"
+#include "types_subtraction.hxx"
 #include "types_addition.hxx"
 #include "types_multiplication.hxx"
 #include "configvariable.hxx"
index b2ebc65..650687f 100644 (file)
@@ -14,7 +14,7 @@ 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];
@@ -37,85 +37,210 @@ UI8 = uint8([8 16 ; 24 32]);
 UI16 = uint16([16 32 ; 48 64]);
 UI32 = uint32([32 64 ; 96 128]);
 UI64 = uint64([64 128 ; 192 256]);
-// double - double
-//r - r
+//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(r - r, 0);
-//r - c
 assert_checkequal(r - c, 1-%i*2);
-//c - r
 assert_checkequal(c - r, -1+%i*2);
-//c - c
 assert_checkequal(c - c, 0*%i);
-//double - DOUBLE
-//r - R
 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);
-//r - C
 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);
-//c - R
 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);
-//c - C
 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);
-//DOUBLE - double
-//R - r
 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);
-//R - c
 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);
-//C - r
 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);
-//c - c
 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);
-//DOUBLE - DOUBLE
-//R - R
 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);
-//R - C
 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);
-//C - R
 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);
-//C - C
 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(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(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]);
 // OPPOSITE
 // - []
 assert_checkequal(-[], []);
 // - eye
 assert_checkequal(-e, eye() * -1);
 // - eye complex
-assert_checkequal(-ei, (-5-%i) * eye());
+assert_checkequal(-ec, (-5-%i) * eye());
 // - double
 assert_checkequal(-r, -2);
 // - double complex
index df294ff..b4dbc64 100644 (file)
@@ -16,7 +16,7 @@ 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];
@@ -41,87 +41,229 @@ UI8 = uint8([8 16 ; 24 32]);
 UI16 = uint16([16 32 ; 48 64]);
 UI32 = uint32([32 64 ; 96 128]);
 UI64 = uint64([64 128 ; 192 256]);
-// double - double
 
-//r - r
+//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(r - r, 0);
-//r - c
 assert_checkequal(r - c, 1-%i*2);
-//c - r
 assert_checkequal(c - r, -1+%i*2);
-//c - c
 assert_checkequal(c - c, 0*%i);
 
-
-//double - DOUBLE
-
-//r - R
 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);
-//r - C
+
 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);
-//c - R
+
 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);
-//c - C
+
 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);
 
-
-//DOUBLE - double
-
-//R - r
 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);
-//R - c
+
 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);
-//C - r
+
 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);
-//c - c
+
 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);
 
-//DOUBLE - DOUBLE
-//R - R
 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);
-//R - C
+
 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);
-//C - R
+
 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);
-//C - C
+
 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(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(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]);
+
+
 
 // OPPOSITE
 
@@ -130,7 +272,7 @@ assert_checkequal(-[], []);
 // - eye
 assert_checkequal(-e, eye() * -1);
 // - eye complex
-assert_checkequal(-ei, (-5-%i) * eye());
+assert_checkequal(-ec, (-5-%i) * eye());
 // - double
 assert_checkequal(-r, -2);
 // - double complex