* Bug 16197 fixed: decomplexify result of extraction when applicable 90/21090/6
St├ęphane MOTTELET [Wed, 18 Sep 2019 13:21:08 +0000 (15:21 +0200)]
https://bugzilla.scilab.org/show_bug.cgi?id=16197

If after extraction imaginary parts of result are all zero then result
is decomplexified. The patch does not interfer with other features like

--> x=complex(zeros(3,1)) // no extraction here
 x  =

   0.
   0.
   0.

--> isreal(x)
 ans  =

  F

but it allows the intuive behaviors below:

--> p=poly([1 1 1 1],"x","coeff"); r=roots(p)
 r  =

   1.i
  -1.i
  -1.

--> isreal(r(3))
 ans  =

  T

Change-Id: Ieed42028fbe36540a549f6f3d3dd7325c370a210

scilab/CHANGES.md
scilab/modules/ast/src/cpp/types/arrayof.cpp
scilab/modules/ast/tests/nonreg_tests/bug_16197.tst [new file with mode: 0644]

index 56953ef..7f88751 100644 (file)
@@ -242,6 +242,7 @@ Bug Fixes
 * [#16160](http://bugzilla.scilab.org/show_bug.cgi?id=16160): `ppol` changed values of third input variable.
 * [#16164](http://bugzilla.scilab.org/show_bug.cgi?id=16164): Help pages in elementary_functions/signal_processing were mislocated.
 * [#16174](http://bugzilla.scilab.org/show_bug.cgi?id=16174): `libraryinfo` yielded 0x0 matrix of strings for libs without macro
+* [#16197](http://bugzilla.scilab.org/show_bug.cgi?id=16197): result of extraction was not decomplexified when applicable.
 * [#16200](http://bugzilla.scilab.org/show_bug.cgi?id=16200): Concatenation of transposed cells crashed Scilab.
 * [#16208](http://bugzilla.scilab.org/show_bug.cgi?id=16208): Using 3D string matrix with old C-api gateways may crash Scilab.
 * [#16209](http://bugzilla.scilab.org/show_bug.cgi?id=16209): grand() causes a freeze after several consecutive calls when using default base generator.
index 67791b1..87158b8 100644 (file)
@@ -1081,13 +1081,14 @@ GenericType* ArrayOf<T>::extract(typed_list* _pArgs)
         }
 
         int dims[2] = {1, 1};
-        pOut = createEmpty(2, dims, isComplex());;
+        pOut = createEmpty(2, dims, false);
         pOut->set(0, get(index));
-        if (isComplex())
+        if (isComplex() && getImg(index) !=0)
         {
+            pOut->setComplex(true);
             pOut->setImg(0, getImg(index));
         }
-
+        
         return pOut;
     }
 
@@ -1123,13 +1124,17 @@ GenericType* ArrayOf<T>::extract(typed_list* _pArgs)
 
         if (isComplex())
         {
+            bool bIsComplex = false;
             for (int i = 0; i < size; ++i)
             {
                 int index = static_cast<int>(idx) - 1;
+                T iValue = getImg(index);
                 pOut->set(i, get(index));
-                pOut->setImg(i, getImg(index));
+                pOut->setImg(i, iValue);
+                bIsComplex |= (iValue !=0);
                 idx += step;
             }
+            pOut->setComplex(bIsComplex);
         }
         else
         {
@@ -1164,6 +1169,7 @@ GenericType* ArrayOf<T>::extract(typed_list* _pArgs)
         int size = getSize();
         if (isComplex())
         {
+            bool bIsComplex = false;
             int idx = 0;
             for (int & i : indexes)
             {
@@ -1173,10 +1179,13 @@ GenericType* ArrayOf<T>::extract(typed_list* _pArgs)
                     return NULL;
                 }
 
+                T iValue = getImg(i);
                 pOut->set(idx, get(i));
-                pOut->setImg(idx, getImg(i));
+                pOut->setImg(idx, iValue);
+                bIsComplex |= (iValue !=0);
                 ++idx;
             }
+            pOut->setComplex(bIsComplex);
         }
         else
         {
@@ -1345,6 +1354,7 @@ GenericType* ArrayOf<T>::extract(typed_list* _pArgs)
         piViewDims[i] = getVarMaxDim(i, iDims);
     }
 
+    bool bIsComplex = false;
     for (int i = 0; i < iSeqCount; i++)
     {
         //increment last dimension
@@ -1400,12 +1410,15 @@ GenericType* ArrayOf<T>::extract(typed_list* _pArgs)
         pOut->set(i, get(iPos));
         if (m_pImgData != NULL)
         {
-            pOut->setImg(i, getImg(iPos));
+            T iValue = getImg(iPos);
+            pOut->setImg(i, iValue);
+            bIsComplex |= (iValue != 0);   
         }
 
-
         piIndex[0]++;
     }
+    
+    pOut->setComplex(bIsComplex);
 
     //free pArg content
     cleanIndexesArguments(_pArgs, &pArg);
diff --git a/scilab/modules/ast/tests/nonreg_tests/bug_16197.tst b/scilab/modules/ast/tests/nonreg_tests/bug_16197.tst
new file mode 100644 (file)
index 0000000..c7d4bf6
--- /dev/null
@@ -0,0 +1,26 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2019 - St├ęphane MOTTELET
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+
+// <-- Non-regression test for bug 16197 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=16197
+//
+// <-- Short Description -->
+// Extraction of real components of complex matrices is counterintuitive
+
+p=poly([1 1 1 1],"x","coeff"); 
+r=roots(p);
+
+assert_checktrue(isreal(r(1)) | isreal(r(2)) | isreal(r(3)))
+
+x = [1+%i 1 2 3 1-%i];
+
+assert_checktrue(isreal(x(2:4)));
\ No newline at end of file