[QR] ldivide fixed about matrix\scalar. 00/17700/5
Cedric Delamarre [Tue, 19 Jan 2016 11:29:48 +0000 (12:29 +0100)]
test_run core QR

Change-Id: I2903173adb5e0e53e6e26d985cb45d187230257a

scilab/modules/ast/src/cpp/operations/types_ldivide.cpp

index 7929efb..a43109a 100644 (file)
@@ -95,6 +95,7 @@ InternalType *GenericLDivide(InternalType *_pLeftOperand, InternalType *_pRightO
 
 int LDivideDoubleByDouble(Double *_pDouble1, Double *_pDouble2, Double **_pDoubleOut)
 {
+    types::Double* pDblTmp = NULL;
     int iErr = 0;
 
     //check finite values of _pDouble1 and _pDouble2
@@ -114,8 +115,34 @@ int LDivideDoubleByDouble(Double *_pDouble1, Double *_pDouble2, Double **_pDoubl
 
     if (_pDouble2->isScalar())
     {
-        //X \ y => y / X
-        return RDivideDoubleByDouble(_pDouble2, _pDouble1, _pDoubleOut);
+        //X \ y => X \ (eye() * y)
+        pDblTmp = new types::Double(_pDouble1->getRows(), _pDouble1->getRows(), _pDouble2->isComplex());
+        double dblScalarReal = _pDouble2->get(0);
+        double* pdblReal = pDblTmp->get();
+        int iSize = pDblTmp->getSize();
+        int iRowsP1 = pDblTmp->getRows() + 1;
+
+        memset(pdblReal, 0x00, iSize * sizeof(double));
+        if (_pDouble2->isComplex())
+        {
+            double dblScalarImag = _pDouble2->getImg(0);
+            double* pdblImag = pDblTmp->getImg();
+            memset(pdblImag, 0x00, iSize * sizeof(double));
+            for (int i = 0; i < iSize; i += iRowsP1)
+            {
+                pdblReal[i] = dblScalarReal;
+                pdblImag[i] = dblScalarImag;
+            }
+        }
+        else
+        {
+            for (int i = 0; i < iSize; i += iRowsP1)
+            {
+                pdblReal[i] = dblScalarReal;
+            }
+        }
+
+        _pDouble2 = pDblTmp;
     }
 
     if (_pDouble1->getDims() > 2 || _pDouble2->getDims() > 2 || _pDouble1->getRows() != _pDouble2->getRows())
@@ -142,6 +169,11 @@ int LDivideDoubleByDouble(Double *_pDouble1, Double *_pDouble2, Double **_pDoubl
                    (*_pDoubleOut)->getReal(), (*_pDoubleOut)->getRows(), (*_pDoubleOut)->getCols(), &dblRcond);
     }
 
+    if (pDblTmp)
+    {
+        delete pDblTmp;
+    }
+
     return iErr;
 }