sparse comparison 00/16900/2
Antoine ELIAS [Mon, 27 Jul 2015 13:03:46 +0000 (15:03 +0200)]
Change-Id: Ia73734697baa94232d8bc08e93c2cebe2dc22b27

scilab/modules/ast/includes/types/sparse.hxx
scilab/modules/ast/src/cpp/types/sparse.cpp
scilab/modules/ast/tests/unit_tests/sparse.dia.ref
scilab/modules/ast/tests/unit_tests/sparse.tst

index 7af8868..2d0fd77 100644 (file)
@@ -385,18 +385,7 @@ struct EXTERN_AST Sparse : GenericType
        @return ptr to a new Sparse matrix where each element is the result of the logical operator
         '<' between the elements of *this and those of o.
      */
-    SparseBool* newLessThan(Sparse const&o) const;
-
-    /* coefficient wise relational operator > between *this sparse matrix and an other.
-       Matrices must have the same dimensions except if one of them is of size (1,1)
-       (i.e. a scalar) : it is then treated as a constant matrix of thre required dimensions.
-
-       @param o other sparse matrix
-
-       @return ptr to a new Sparse matrix where each element is the result of the logical operator
-        '>' between the elements of *this and those of o.
-     */
-    SparseBool* newGreaterThan(Sparse const&o) const;
+    SparseBool* newLessThan(Sparse &o);
 
     /* coefficient wise relational operator != between *this sparse matrix and an other.
        Matrices must have the same dimensions except if one of them is of size (1,1)
@@ -422,22 +411,7 @@ struct EXTERN_AST Sparse : GenericType
        @return ptr to a new Sparse matrix where each element is the result of the logical operator
         '<=' between the elements of *this and those of o.
      */
-    SparseBool* newLessOrEqual(Sparse const&o) const;
-
-    /* coefficient wise relational operator >= between *this sparse matrix and an other.
-       Matrices must have the same dimensions except if one of them is of size (1,1)
-       (i.e. a scalar) : it is then treated as a constant matrix of thre required dimensions.
-
-       Do not use this function is possible as the result will be dense because
-       0. >= 0. is true, hence the result matrix will hold a non default value (i.e. true)
-       for each pair of default values (0.) of the sparse arguments !
-
-       @param o other sparse matrix
-
-       @return ptr to a new Sparse matrix where each element is the result of the logical operator
-        '>=' between the elements of *this and those of o.
-     */
-    SparseBool* newGreaterOrEqual(Sparse const&o) const;
+    SparseBool* newLessOrEqual(Sparse &o);
 
     /* coefficient wise relational operator == between *this sparse matrix and an other.
        Matrices must have the same dimensions except if one of them is of size (1,1)
index daa7564..1898776 100644 (file)
@@ -2235,14 +2235,96 @@ void Sparse::opposite(void)
     }
 }
 
-SparseBool* Sparse::newLessThan(Sparse const&o) const
+SparseBool* Sparse::newLessThan(Sparse &o)
 {
-    return cwiseOp<std::less>(*this, o);
-}
+    //only real values !
 
-SparseBool* Sparse::newGreaterThan(Sparse const&o) const
-{
-    return cwiseOp<std::greater>(*this, o);
+    //return cwiseOp<std::less>(*this, o);
+    int rowL = getRows();
+    int colL = getCols();
+
+    int rowR = o.getRows();
+    int colR = o.getCols();
+    int row = std::max(rowL, rowR);
+    int col = std::max(colL, colR);
+
+    //create a boolean sparse matrix with dims of sparses
+    types::SparseBool* ret = new types::SparseBool(row, col);
+    if (isScalar() && o.isScalar())
+    {
+        double l = get(0, 0);
+        double r = o.get(0, 0);
+        ret->set(0, 0, l < r, false);
+    }
+    else if (isScalar())
+    {
+        int nnzR = static_cast<int>(o.nonZeros());
+        std::vector<int> rowcolR(nnzR * 2, 0);
+        o.outputRowCol(rowcolR.data());
+
+        //compare all items of R with R[0]
+        double l = get(0, 0);
+        if (l < 0)
+        {
+            //set true
+            ret->setTrue(false);
+        }
+
+        for (int i = 0; i < nnzR; ++i)
+        {
+            double r = o.get(rowcolR[i] - 1, rowcolR[i + nnzR] - 1);
+            ret->set(rowcolR[i] - 1, rowcolR[i + nnzR] - 1, l < r, false);
+        }
+    }
+    else if (o.isScalar())
+    {
+        int nnzL = static_cast<int>(nonZeros());
+        std::vector<int> rowcolL(nnzL * 2, 0);
+        outputRowCol(rowcolL.data());
+
+        double r = o.get(0, 0);
+        if (r >= 0)
+        {
+            ret->setTrue(true);
+        }
+
+        for (int i = 0; i < nnzL; ++i)
+        {
+            double l = get(rowcolL[i] - 1, rowcolL[i + nnzL] - 1);
+            ret->set(rowcolL[i] - 1, rowcolL[i + nnzL] - 1, l < r, false);
+        }
+    }
+    else
+    {
+        int nnzR = static_cast<int>(o.nonZeros());
+        std::vector<int> rowcolR(nnzR * 2, 0);
+        o.outputRowCol(rowcolR.data());
+        int nnzL = static_cast<int>(nonZeros());
+        std::vector<int> rowcolL(nnzL * 2, 0);
+        outputRowCol(rowcolL.data());
+        //set all values to %t
+        ret->setFalse(false);
+
+        for (int i = 0; i < nnzL; ++i)
+        {
+            double l = get(rowcolL[i] - 1, rowcolL[i + nnzL] - 1);
+            ret->set(rowcolL[i] - 1, rowcolL[i + nnzL] - 1, l < 0, false);
+        }
+        ret->finalize();
+
+        //set _pR[i] == _pL[i] for each _pR values
+        for (int i = 0; i < nnzR; ++i)
+        {
+            //get l and r following non zeros value of R
+            double l = get(rowcolR[i] - 1, rowcolR[i + nnzR] - 1);
+            double r = o.get(rowcolR[i] - 1, rowcolR[i + nnzR] - 1);
+            //set value following non zeros value of R
+            ret->set(rowcolR[i] - 1, rowcolR[i + nnzR] - 1, l < r, false);
+        }
+    }
+
+    ret->finalize();
+    return ret;
 }
 
 SparseBool* Sparse::newNotEqualTo(Sparse const&o) const
@@ -2250,14 +2332,96 @@ SparseBool* Sparse::newNotEqualTo(Sparse const&o) const
     return cwiseOp<std::not_equal_to>(*this, o);
 }
 
-SparseBool* Sparse::newLessOrEqual(Sparse const&o) const
+SparseBool* Sparse::newLessOrEqual(Sparse &o)
 {
-    return cwiseOp<std::less_equal>(*this, o);
-}
+    //only real values !
 
-SparseBool* Sparse::newGreaterOrEqual(Sparse const&o) const
-{
-    return cwiseOp<std::greater_equal>(*this, o);
+    //return cwiseOp<std::less>(*this, o);
+    int rowL = getRows();
+    int colL = getCols();
+
+    int rowR = o.getRows();
+    int colR = o.getCols();
+    int row = std::max(rowL, rowR);
+    int col = std::max(colL, colR);
+
+    //create a boolean sparse matrix with dims of sparses
+    types::SparseBool* ret = new types::SparseBool(row, col);
+    if (isScalar() && o.isScalar())
+    {
+        double l = get(0, 0);
+        double r = o.get(0, 0);
+        ret->set(0, 0, l <= r, false);
+    }
+    else if (isScalar())
+    {
+        int nnzR = static_cast<int>(o.nonZeros());
+        std::vector<int> rowcolR(nnzR * 2, 0);
+        o.outputRowCol(rowcolR.data());
+
+        //compare all items of R with R[0]
+        double l = get(0, 0);
+        if (l <= 0)
+        {
+            //set true
+            ret->setTrue(false);
+        }
+
+        for (int i = 0; i < nnzR; ++i)
+        {
+            double r = o.get(rowcolR[i] - 1, rowcolR[i + nnzR] - 1);
+            ret->set(rowcolR[i] - 1, rowcolR[i + nnzR] - 1, l <= r, false);
+        }
+    }
+    else if (o.isScalar())
+    {
+        int nnzL = static_cast<int>(nonZeros());
+        std::vector<int> rowcolL(nnzL * 2, 0);
+        outputRowCol(rowcolL.data());
+
+        double r = o.get(0, 0);
+        if (r > 0)
+        {
+            ret->setTrue(true);
+        }
+
+        for (int i = 0; i < nnzL; ++i)
+        {
+            double l = get(rowcolL[i] - 1, rowcolL[i + nnzL] - 1);
+            ret->set(rowcolL[i] - 1, rowcolL[i + nnzL] - 1, l <= r, false);
+        }
+    }
+    else
+    {
+        int nnzR = static_cast<int>(o.nonZeros());
+        std::vector<int> rowcolR(nnzR * 2, 0);
+        o.outputRowCol(rowcolR.data());
+        int nnzL = static_cast<int>(nonZeros());
+        std::vector<int> rowcolL(nnzL * 2, 0);
+        outputRowCol(rowcolL.data());
+        //set all values to %t
+        ret->setTrue(false);
+
+        for (int i = 0; i < nnzL; ++i)
+        {
+            double l = get(rowcolL[i] - 1, rowcolL[i + nnzL] - 1);
+            ret->set(rowcolL[i] - 1, rowcolL[i + nnzL] - 1, l <= 0, false);
+        }
+        ret->finalize();
+
+        //set _pR[i] == _pL[i] for each _pR values
+        for (int i = 0; i < nnzR; ++i)
+        {
+            //get l and r following non zeros value of R
+            double l = get(rowcolR[i] - 1, rowcolR[i + nnzR] - 1);
+            double r = o.get(rowcolR[i] - 1, rowcolR[i + nnzR] - 1);
+            //set value following non zeros value of R
+            ret->set(rowcolR[i] - 1, rowcolR[i + nnzR] - 1, l <= r, false);
+        }
+    }
+
+    ret->finalize();
+    return ret;
 }
 
 SparseBool* Sparse::newEqualTo(Sparse &o)
index d303a1f..43a10e5 100644 (file)
@@ -789,41 +789,189 @@ b=sparse([1 6;1 2;6 5],[10;-1;-1],[6 6]);
 assert_checkequal(full(a==a), full(a)==full(a));
 assert_checkequal(full(a<>a), (full(a)<>full(a)));
 assert_checkequal(full(a>sparse(5)), (full(a)>5));
+assert_checkequal(full(a<sparse(5)), (full(a)<5));
+assert_checkequal(full(a>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(a<=sparse(5)), (full(a)<=5));
 assert_checkequal(full(sparse(5)>a), (5>full(a)));
+assert_checkequal(full(sparse(5)<a), (5<full(a)));
+assert_checkequal(full(sparse(5)>=a), (5>=full(a)));
+assert_checkequal(full(sparse(5)<=a), (5<=full(a)));
 assert_checkequal(full(b>a), (full(b)>full(a)));
+assert_checkequal(full(b<a), (full(b)<full(a)));
+assert_checkequal(full(b>=a), (full(b)>=full(a)));
+assert_checkequal(full(b<=a), (full(b)<=full(a)));
 assert_checkequal(full(a==full(a)), full(a)==full(a));
 assert_checkequal(full(a<>full(a)), (full(a)<>full(a)));
 assert_checkequal(full(a>5), (full(a)>5));
+assert_checkequal(full(a<5), (full(a)<5));
+assert_checkequal(full(a>=5), (full(a)>=5));
+assert_checkequal(full(a<=5), (full(a)<=5));
 assert_checkequal(full(5>a), (5>full(a)));
+assert_checkequal(full(5<a), (5<full(a)));
+assert_checkequal(full(5>=a), (5>=full(a)));
+assert_checkequal(full(5<=a), (5<=full(a)));
 assert_checkequal(full(b>full(a)), (full(b)>full(a)));
+assert_checkequal(full(b<full(a)), (full(b)<full(a)));
+assert_checkequal(full(b>=full(a)), (full(b)>=full(a)));
+assert_checkequal(full(b<=full(a)), (full(b)<=full(a)));
 assert_checkequal(full(full(a)==a), full(a)==full(a));
 assert_checkequal(full(full(a)<>a), (full(a)<>full(a)));
 assert_checkequal(full(full(a)>sparse(5)), (full(a)>5));
+assert_checkequal(full(full(a)<sparse(5)), (full(a)<5));
+assert_checkequal(full(full(a)>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(full(a)<=sparse(5)), (full(a)<=5));
 assert_checkequal(full(full(b)>a), (full(b)>full(a)));
+assert_checkequal(full(full(b)<a), (full(b)<full(a)));
+assert_checkequal(full(full(b)>=a), (full(b)>=full(a)));
+assert_checkequal(full(full(b)<=a), (full(b)<=full(a)));
+a=sparse([1 6;1 5;1 3;2 4;2 1;4 4;4 3;5 1;6 6],-(1:9),[6 6]);
+b=sparse([1 6;1 2;6 5],[10;-1;-1],[6 6]);
+assert_checkequal(full(a==a), full(a)==full(a));
+assert_checkequal(full(a<>a), (full(a)<>full(a)));
+assert_checkequal(full(a>sparse(5)), (full(a)>5));
+assert_checkequal(full(a<sparse(5)), (full(a)<5));
+assert_checkequal(full(a>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(a<=sparse(5)), (full(a)<=5));
+assert_checkequal(full(sparse(5)>a), (5>full(a)));
+assert_checkequal(full(sparse(5)<a), (5<full(a)));
+assert_checkequal(full(sparse(5)>=a), (5>=full(a)));
+assert_checkequal(full(sparse(5)<=a), (5<=full(a)));
+assert_checkequal(full(b>a), (full(b)>full(a)));
+assert_checkequal(full(b<a), (full(b)<full(a)));
+assert_checkequal(full(b>=a), (full(b)>=full(a)));
+assert_checkequal(full(b<=a), (full(b)<=full(a)));
+assert_checkequal(full(a==full(a)), full(a)==full(a));
+assert_checkequal(full(a<>full(a)), (full(a)<>full(a)));
+assert_checkequal(full(a>5), (full(a)>5));
+assert_checkequal(full(a<5), (full(a)<5));
+assert_checkequal(full(a>=5), (full(a)>=5));
+assert_checkequal(full(a<=5), (full(a)<=5));
+assert_checkequal(full(5>a), (5>full(a)));
+assert_checkequal(full(5<a), (5<full(a)));
+assert_checkequal(full(5>=a), (5>=full(a)));
+assert_checkequal(full(5<=a), (5<=full(a)));
+assert_checkequal(full(b>full(a)), (full(b)>full(a)));
+assert_checkequal(full(b<full(a)), (full(b)<full(a)));
+assert_checkequal(full(b>=full(a)), (full(b)>=full(a)));
+assert_checkequal(full(b<=full(a)), (full(b)<=full(a)));
+assert_checkequal(full(full(a)==a), full(a)==full(a));
+assert_checkequal(full(full(a)<>a), (full(a)<>full(a)));
+assert_checkequal(full(full(a)>sparse(5)), (full(a)>5));
+assert_checkequal(full(full(a)<sparse(5)), (full(a)<5));
+assert_checkequal(full(full(a)>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(full(a)<=sparse(5)), (full(a)<=5));
+assert_checkequal(full(full(b)>a), (full(b)>full(a)));
+assert_checkequal(full(full(b)<a), (full(b)<full(a)));
+assert_checkequal(full(full(b)>=a), (full(b)>=full(a)));
+assert_checkequal(full(full(b)<=a), (full(b)<=full(a)));
 a=sparse([1 1;3 1;6 1],[10 11 12],[6 1]);
 assert_checkequal(full(a==a), full(a)==full(a));
 assert_checkequal(full(a<>a), (full(a)<>full(a)));
 assert_checkequal(full(a>sparse(5)), (full(a)>5));
+assert_checkequal(full(a<sparse(5)), (full(a)<5));
+assert_checkequal(full(a>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(a<=sparse(5)), (full(a)<=5));
+assert_checkequal(full(sparse(5)>a), (5>full(a)));
+assert_checkequal(full(sparse(5)<a), (5<full(a)));
+assert_checkequal(full(sparse(5)>=a), (5>=full(a)));
+assert_checkequal(full(sparse(5)<=a), (5<=full(a)));
+assert_checkequal(full(a==full(a)), full(a)==full(a));
+assert_checkequal(full(a<>full(a)), (full(a)<>full(a)));
+assert_checkequal(full(a>5), (full(a)>5));
+assert_checkequal(full(a<5), (full(a)<5));
+assert_checkequal(full(a>=5), (full(a)>=5));
+assert_checkequal(full(a<=5), (full(a)<=5));
+assert_checkequal(full(5>a), (5>full(a)));
+assert_checkequal(full(5<a), (5<full(a)));
+assert_checkequal(full(5>=a), (5>=full(a)));
+assert_checkequal(full(5<=a), (5<=full(a)));
+assert_checkequal(full(full(a)==a), full(a)==full(a));
+assert_checkequal(full(full(a)<>a), (full(a)<>full(a)));
+assert_checkequal(full(full(a)>sparse(5)), (full(a)>5));
+assert_checkequal(full(full(a)<sparse(5)), (full(a)<5));
+assert_checkequal(full(full(a)>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(full(a)<=sparse(5)), (full(a)<=5));
+a=a';
+assert_checkequal(full(a==a), full(a)==full(a));
+assert_checkequal(full(a<>a), (full(a)<>full(a)));
+assert_checkequal(full(a>sparse(5)), (full(a)>5));
+assert_checkequal(full(a<sparse(5)), (full(a)<5));
+assert_checkequal(full(a>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(a<=sparse(5)), (full(a)<=5));
+assert_checkequal(full(sparse(5)>a), (5>full(a)));
+assert_checkequal(full(sparse(5)<a), (5<full(a)));
+assert_checkequal(full(sparse(5)>=a), (5>=full(a)));
+assert_checkequal(full(sparse(5)<=a), (5<=full(a)));
+assert_checkequal(full(a==full(a)), full(a)==full(a));
+assert_checkequal(full(a<>full(a)), (full(a)<>full(a)));
+assert_checkequal(full(a>5), (full(a)>5));
+assert_checkequal(full(a<5), (full(a)<5));
+assert_checkequal(full(a>=5), (full(a)>=5));
+assert_checkequal(full(a<=5), (full(a)<=5));
+assert_checkequal(full(5>a), (5>full(a)));
+assert_checkequal(full(5<a), (5<full(a)));
+assert_checkequal(full(5>=a), (5>=full(a)));
+assert_checkequal(full(5<=a), (5<=full(a)));
+assert_checkequal(full(full(a)==a), full(a)==full(a));
+assert_checkequal(full(full(a)<>a), (full(a)<>full(a)));
+assert_checkequal(full(full(a)>sparse(5)), (full(a)>5));
+assert_checkequal(full(full(a)<sparse(5)), (full(a)<5));
+assert_checkequal(full(full(a)>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(full(a)<=sparse(5)), (full(a)<=5));
+a=sparse([1 1;3 1;6 1],[-10 -11 -12],[6 1]);
+assert_checkequal(full(a==a), full(a)==full(a));
+assert_checkequal(full(a<>a), (full(a)<>full(a)));
+assert_checkequal(full(a>sparse(5)), (full(a)>5));
+assert_checkequal(full(a<sparse(5)), (full(a)<5));
+assert_checkequal(full(a>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(a<=sparse(5)), (full(a)<=5));
 assert_checkequal(full(sparse(5)>a), (5>full(a)));
+assert_checkequal(full(sparse(5)<a), (5<full(a)));
+assert_checkequal(full(sparse(5)>=a), (5>=full(a)));
+assert_checkequal(full(sparse(5)<=a), (5<=full(a)));
 assert_checkequal(full(a==full(a)), full(a)==full(a));
 assert_checkequal(full(a<>full(a)), (full(a)<>full(a)));
 assert_checkequal(full(a>5), (full(a)>5));
+assert_checkequal(full(a<5), (full(a)<5));
+assert_checkequal(full(a>=5), (full(a)>=5));
+assert_checkequal(full(a<=5), (full(a)<=5));
 assert_checkequal(full(5>a), (5>full(a)));
+assert_checkequal(full(5<a), (5<full(a)));
+assert_checkequal(full(5>=a), (5>=full(a)));
+assert_checkequal(full(5<=a), (5<=full(a)));
 assert_checkequal(full(full(a)==a), full(a)==full(a));
 assert_checkequal(full(full(a)<>a), (full(a)<>full(a)));
 assert_checkequal(full(full(a)>sparse(5)), (full(a)>5));
+assert_checkequal(full(full(a)<sparse(5)), (full(a)<5));
+assert_checkequal(full(full(a)>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(full(a)<=sparse(5)), (full(a)<=5));
 a=a';
 assert_checkequal(full(a==a), full(a)==full(a));
 assert_checkequal(full(a<>a), (full(a)<>full(a)));
 assert_checkequal(full(a>sparse(5)), (full(a)>5));
+assert_checkequal(full(a<sparse(5)), (full(a)<5));
+assert_checkequal(full(a>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(a<=sparse(5)), (full(a)<=5));
 assert_checkequal(full(sparse(5)>a), (5>full(a)));
+assert_checkequal(full(sparse(5)<a), (5<full(a)));
+assert_checkequal(full(sparse(5)>=a), (5>=full(a)));
+assert_checkequal(full(sparse(5)<=a), (5<=full(a)));
 assert_checkequal(full(a==full(a)), full(a)==full(a));
 assert_checkequal(full(a<>full(a)), (full(a)<>full(a)));
 assert_checkequal(full(a>5), (full(a)>5));
+assert_checkequal(full(a<5), (full(a)<5));
+assert_checkequal(full(a>=5), (full(a)>=5));
+assert_checkequal(full(a<=5), (full(a)<=5));
 assert_checkequal(full(5>a), (5>full(a)));
+assert_checkequal(full(5<a), (5<full(a)));
+assert_checkequal(full(5>=a), (5>=full(a)));
+assert_checkequal(full(5<=a), (5<=full(a)));
 assert_checkequal(full(full(a)==a), full(a)==full(a));
 assert_checkequal(full(full(a)<>a), (full(a)<>full(a)));
 assert_checkequal(full(full(a)>sparse(5)), (full(a)>5));
+assert_checkequal(full(full(a)<sparse(5)), (full(a)<5));
+assert_checkequal(full(full(a)>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(full(a)<=sparse(5)), (full(a)<=5));
 a=sparse([1 6;1 5;1 3;2 4;2 1;4 4;4 3;5 1;6 6],1:9,[6 6]);
 b=sparse([1 6;1 2;5 5],[10;-1;-1],[5 6]);
 assert_checkfalse(a==b);
index 53189af..fe81969 100644 (file)
 
 //from dense form
 s=[ 1,0,0,0,0,0,0;
-    0,1,0,0,0,0,0;
-    0,0,1,0,0,0,0;
-    0,0,1,1,0,0,0;
-    0,0,1,1,1,0,0;
-    0,0,1,1,0,1,0;
-    0,0,1,1,0,1,1];
+0,1,0,0,0,0,0;
+0,0,1,0,0,0,0;
+0,0,1,1,0,0,0;
+0,0,1,1,1,0,0;
+0,0,1,1,0,1,0;
+0,0,1,1,0,1,1];
 sp=sparse(s);
 
 assert_checkequal(size(s), size(sp));
@@ -71,7 +71,7 @@ A = [A 0];
 A = [A 0];
 
 assert_checkequal(full(A), [1 0 0 0]);
-assert_checkequal(size(A, 'c'), 4);
+assert_checkequal(size(A, "c"), 4);
 
 //extraction
 assert_checkequal(full(sp(:)), s(:));
@@ -132,11 +132,11 @@ assert_checkequal(full(v), a);
 //  -- for complex matrix
 sp=sparse([1 6;1 5;1 3;2 4;2 1;4 4;4 3;5 1;6 6],(1:9)+%i*(21:29),[6 6]);
 a=[0,0,3+%i*23,0,2+%i*22,1+%i*21
-   5+%i*25,0,0,4+%i*24,0,0
-   0,0,0,0,0,0
-   0,0,7+%i*27,6+%i*26,0,0
-   8+%i*28,0,0,0,0,0
-   0,0,0,0,0,9+%i*29];
+5+%i*25,0,0,4+%i*24,0,0
+0,0,0,0,0,0
+0,0,7+%i*27,6+%i*26,0,0
+8+%i*28,0,0,0,0,0
+0,0,0,0,0,9+%i*29];
 assert_checkequal(full(sp), a);
 sp=sparse([1 6;1 5;1 3;2 4;2 1;4 4;4 3;5 1;6 6],(1:9)+%i*(21:29),[8 6]);
 a(8,6)=0;
@@ -811,41 +811,193 @@ b=sparse([1 6;1 2;6 5],[10;-1;-1],[6 6]);
 assert_checkequal(full(a==a), full(a)==full(a));
 assert_checkequal(full(a<>a), (full(a)<>full(a)));
 assert_checkequal(full(a>sparse(5)), (full(a)>5));
+assert_checkequal(full(a<sparse(5)), (full(a)<5));
+assert_checkequal(full(a>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(a<=sparse(5)), (full(a)<=5));
 assert_checkequal(full(sparse(5)>a), (5>full(a)));
+assert_checkequal(full(sparse(5)<a), (5<full(a)));
+assert_checkequal(full(sparse(5)>=a), (5>=full(a)));
+assert_checkequal(full(sparse(5)<=a), (5<=full(a)));
 assert_checkequal(full(b>a), (full(b)>full(a)));
+assert_checkequal(full(b<a), (full(b)<full(a)));
+assert_checkequal(full(b>=a), (full(b)>=full(a)));
+assert_checkequal(full(b<=a), (full(b)<=full(a)));
 assert_checkequal(full(a==full(a)), full(a)==full(a));
 assert_checkequal(full(a<>full(a)), (full(a)<>full(a)));
 assert_checkequal(full(a>5), (full(a)>5));
+assert_checkequal(full(a<5), (full(a)<5));
+assert_checkequal(full(a>=5), (full(a)>=5));
+assert_checkequal(full(a<=5), (full(a)<=5));
 assert_checkequal(full(5>a), (5>full(a)));
+assert_checkequal(full(5<a), (5<full(a)));
+assert_checkequal(full(5>=a), (5>=full(a)));
+assert_checkequal(full(5<=a), (5<=full(a)));
 assert_checkequal(full(b>full(a)), (full(b)>full(a)));
+assert_checkequal(full(b<full(a)), (full(b)<full(a)));
+assert_checkequal(full(b>=full(a)), (full(b)>=full(a)));
+assert_checkequal(full(b<=full(a)), (full(b)<=full(a)));
 assert_checkequal(full(full(a)==a), full(a)==full(a));
 assert_checkequal(full(full(a)<>a), (full(a)<>full(a)));
 assert_checkequal(full(full(a)>sparse(5)), (full(a)>5));
+assert_checkequal(full(full(a)<sparse(5)), (full(a)<5));
+assert_checkequal(full(full(a)>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(full(a)<=sparse(5)), (full(a)<=5));
 assert_checkequal(full(full(b)>a), (full(b)>full(a)));
+assert_checkequal(full(full(b)<a), (full(b)<full(a)));
+assert_checkequal(full(full(b)>=a), (full(b)>=full(a)));
+assert_checkequal(full(full(b)<=a), (full(b)<=full(a)));
+
+a=sparse([1 6;1 5;1 3;2 4;2 1;4 4;4 3;5 1;6 6],-(1:9),[6 6]);
+b=sparse([1 6;1 2;6 5],[10;-1;-1],[6 6]);
+assert_checkequal(full(a==a), full(a)==full(a));
+assert_checkequal(full(a<>a), (full(a)<>full(a)));
+assert_checkequal(full(a>sparse(5)), (full(a)>5));
+assert_checkequal(full(a<sparse(5)), (full(a)<5));
+assert_checkequal(full(a>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(a<=sparse(5)), (full(a)<=5));
+assert_checkequal(full(sparse(5)>a), (5>full(a)));
+assert_checkequal(full(sparse(5)<a), (5<full(a)));
+assert_checkequal(full(sparse(5)>=a), (5>=full(a)));
+assert_checkequal(full(sparse(5)<=a), (5<=full(a)));
+assert_checkequal(full(b>a), (full(b)>full(a)));
+assert_checkequal(full(b<a), (full(b)<full(a)));
+assert_checkequal(full(b>=a), (full(b)>=full(a)));
+assert_checkequal(full(b<=a), (full(b)<=full(a)));
+assert_checkequal(full(a==full(a)), full(a)==full(a));
+assert_checkequal(full(a<>full(a)), (full(a)<>full(a)));
+assert_checkequal(full(a>5), (full(a)>5));
+assert_checkequal(full(a<5), (full(a)<5));
+assert_checkequal(full(a>=5), (full(a)>=5));
+assert_checkequal(full(a<=5), (full(a)<=5));
+assert_checkequal(full(5>a), (5>full(a)));
+assert_checkequal(full(5<a), (5<full(a)));
+assert_checkequal(full(5>=a), (5>=full(a)));
+assert_checkequal(full(5<=a), (5<=full(a)));
+assert_checkequal(full(b>full(a)), (full(b)>full(a)));
+assert_checkequal(full(b<full(a)), (full(b)<full(a)));
+assert_checkequal(full(b>=full(a)), (full(b)>=full(a)));
+assert_checkequal(full(b<=full(a)), (full(b)<=full(a)));
+assert_checkequal(full(full(a)==a), full(a)==full(a));
+assert_checkequal(full(full(a)<>a), (full(a)<>full(a)));
+assert_checkequal(full(full(a)>sparse(5)), (full(a)>5));
+assert_checkequal(full(full(a)<sparse(5)), (full(a)<5));
+assert_checkequal(full(full(a)>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(full(a)<=sparse(5)), (full(a)<=5));
+assert_checkequal(full(full(b)>a), (full(b)>full(a)));
+assert_checkequal(full(full(b)<a), (full(b)<full(a)));
+assert_checkequal(full(full(b)>=a), (full(b)>=full(a)));
+assert_checkequal(full(full(b)<=a), (full(b)<=full(a)));
+
 a=sparse([1 1;3 1;6 1],[10 11 12],[6 1]);
 assert_checkequal(full(a==a), full(a)==full(a));
 assert_checkequal(full(a<>a), (full(a)<>full(a)));
 assert_checkequal(full(a>sparse(5)), (full(a)>5));
+assert_checkequal(full(a<sparse(5)), (full(a)<5));
+assert_checkequal(full(a>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(a<=sparse(5)), (full(a)<=5));
+assert_checkequal(full(sparse(5)>a), (5>full(a)));
+assert_checkequal(full(sparse(5)<a), (5<full(a)));
+assert_checkequal(full(sparse(5)>=a), (5>=full(a)));
+assert_checkequal(full(sparse(5)<=a), (5<=full(a)));
+assert_checkequal(full(a==full(a)), full(a)==full(a));
+assert_checkequal(full(a<>full(a)), (full(a)<>full(a)));
+assert_checkequal(full(a>5), (full(a)>5));
+assert_checkequal(full(a<5), (full(a)<5));
+assert_checkequal(full(a>=5), (full(a)>=5));
+assert_checkequal(full(a<=5), (full(a)<=5));
+assert_checkequal(full(5>a), (5>full(a)));
+assert_checkequal(full(5<a), (5<full(a)));
+assert_checkequal(full(5>=a), (5>=full(a)));
+assert_checkequal(full(5<=a), (5<=full(a)));
+assert_checkequal(full(full(a)==a), full(a)==full(a));
+assert_checkequal(full(full(a)<>a), (full(a)<>full(a)));
+assert_checkequal(full(full(a)>sparse(5)), (full(a)>5));
+assert_checkequal(full(full(a)<sparse(5)), (full(a)<5));
+assert_checkequal(full(full(a)>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(full(a)<=sparse(5)), (full(a)<=5));
+a=a';
+assert_checkequal(full(a==a), full(a)==full(a));
+assert_checkequal(full(a<>a), (full(a)<>full(a)));
+assert_checkequal(full(a>sparse(5)), (full(a)>5));
+assert_checkequal(full(a<sparse(5)), (full(a)<5));
+assert_checkequal(full(a>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(a<=sparse(5)), (full(a)<=5));
 assert_checkequal(full(sparse(5)>a), (5>full(a)));
+assert_checkequal(full(sparse(5)<a), (5<full(a)));
+assert_checkequal(full(sparse(5)>=a), (5>=full(a)));
+assert_checkequal(full(sparse(5)<=a), (5<=full(a)));
 assert_checkequal(full(a==full(a)), full(a)==full(a));
 assert_checkequal(full(a<>full(a)), (full(a)<>full(a)));
 assert_checkequal(full(a>5), (full(a)>5));
+assert_checkequal(full(a<5), (full(a)<5));
+assert_checkequal(full(a>=5), (full(a)>=5));
+assert_checkequal(full(a<=5), (full(a)<=5));
 assert_checkequal(full(5>a), (5>full(a)));
+assert_checkequal(full(5<a), (5<full(a)));
+assert_checkequal(full(5>=a), (5>=full(a)));
+assert_checkequal(full(5<=a), (5<=full(a)));
 assert_checkequal(full(full(a)==a), full(a)==full(a));
 assert_checkequal(full(full(a)<>a), (full(a)<>full(a)));
 assert_checkequal(full(full(a)>sparse(5)), (full(a)>5));
+assert_checkequal(full(full(a)<sparse(5)), (full(a)<5));
+assert_checkequal(full(full(a)>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(full(a)<=sparse(5)), (full(a)<=5));
+
+a=sparse([1 1;3 1;6 1],[-10 -11 -12],[6 1]);
+assert_checkequal(full(a==a), full(a)==full(a));
+assert_checkequal(full(a<>a), (full(a)<>full(a)));
+assert_checkequal(full(a>sparse(5)), (full(a)>5));
+assert_checkequal(full(a<sparse(5)), (full(a)<5));
+assert_checkequal(full(a>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(a<=sparse(5)), (full(a)<=5));
+assert_checkequal(full(sparse(5)>a), (5>full(a)));
+assert_checkequal(full(sparse(5)<a), (5<full(a)));
+assert_checkequal(full(sparse(5)>=a), (5>=full(a)));
+assert_checkequal(full(sparse(5)<=a), (5<=full(a)));
+assert_checkequal(full(a==full(a)), full(a)==full(a));
+assert_checkequal(full(a<>full(a)), (full(a)<>full(a)));
+assert_checkequal(full(a>5), (full(a)>5));
+assert_checkequal(full(a<5), (full(a)<5));
+assert_checkequal(full(a>=5), (full(a)>=5));
+assert_checkequal(full(a<=5), (full(a)<=5));
+assert_checkequal(full(5>a), (5>full(a)));
+assert_checkequal(full(5<a), (5<full(a)));
+assert_checkequal(full(5>=a), (5>=full(a)));
+assert_checkequal(full(5<=a), (5<=full(a)));
+assert_checkequal(full(full(a)==a), full(a)==full(a));
+assert_checkequal(full(full(a)<>a), (full(a)<>full(a)));
+assert_checkequal(full(full(a)>sparse(5)), (full(a)>5));
+assert_checkequal(full(full(a)<sparse(5)), (full(a)<5));
+assert_checkequal(full(full(a)>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(full(a)<=sparse(5)), (full(a)<=5));
 a=a';
 assert_checkequal(full(a==a), full(a)==full(a));
 assert_checkequal(full(a<>a), (full(a)<>full(a)));
 assert_checkequal(full(a>sparse(5)), (full(a)>5));
+assert_checkequal(full(a<sparse(5)), (full(a)<5));
+assert_checkequal(full(a>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(a<=sparse(5)), (full(a)<=5));
 assert_checkequal(full(sparse(5)>a), (5>full(a)));
+assert_checkequal(full(sparse(5)<a), (5<full(a)));
+assert_checkequal(full(sparse(5)>=a), (5>=full(a)));
+assert_checkequal(full(sparse(5)<=a), (5<=full(a)));
 assert_checkequal(full(a==full(a)), full(a)==full(a));
 assert_checkequal(full(a<>full(a)), (full(a)<>full(a)));
 assert_checkequal(full(a>5), (full(a)>5));
+assert_checkequal(full(a<5), (full(a)<5));
+assert_checkequal(full(a>=5), (full(a)>=5));
+assert_checkequal(full(a<=5), (full(a)<=5));
 assert_checkequal(full(5>a), (5>full(a)));
+assert_checkequal(full(5<a), (5<full(a)));
+assert_checkequal(full(5>=a), (5>=full(a)));
+assert_checkequal(full(5<=a), (5<=full(a)));
 assert_checkequal(full(full(a)==a), full(a)==full(a));
 assert_checkequal(full(full(a)<>a), (full(a)<>full(a)));
 assert_checkequal(full(full(a)>sparse(5)), (full(a)>5));
+assert_checkequal(full(full(a)<sparse(5)), (full(a)<5));
+assert_checkequal(full(full(a)>=sparse(5)), (full(a)>=5));
+assert_checkequal(full(full(a)<=sparse(5)), (full(a)<=5));
+
 a=sparse([1 6;1 5;1 3;2 4;2 1;4 4;4 3;5 1;6 6],1:9,[6 6]);
 b=sparse([1 6;1 2;5 5],[10;-1;-1],[5 6]);
 assert_checkfalse(a==b);