* Buf #12772 fixed- eigs() failed when trying to solve a sparse matrix eigen value... 89/12189/2
Adeline CARNIS [Tue, 30 Jul 2013 11:58:32 +0000 (13:58 +0200)]
Change-Id: Ia9f6ebc03b99541e7201bb7c86208fab3ae53794

scilab/CHANGES_5.5.X
scilab/modules/arnoldi/macros/eigs.sci
scilab/modules/arnoldi/tests/nonreg_tests/bug_12772.dia.ref [new file with mode: 0644]
scilab/modules/arnoldi/tests/nonreg_tests/bug_12772.tst [new file with mode: 0644]

index a3fe61c..fec9864 100644 (file)
@@ -503,3 +503,5 @@ Bug fixes
 * Bug #12758 fixed - Focus issue with plot3d() fixed.
 
 * Bug #12747 fixed - legendre() now accepts the -1 and 1 values for the third argument.
+
+* Bug #12772 fixed - eigs() failed when trying to solve a sparse matrix eigen value problem.
index 629e365..4d4199d 100644 (file)
@@ -574,7 +574,6 @@ function [res_d, res_v] = speigs(A, %_B, nev, which, maxiter, tol, ncv, cholB, r
     if(iparam(7) == 3)
         umf_ludel(Lup);
     end
-
     if(Areal & Breal)
         if(Asym)
             [d, z, resid, v, iparam, iptnr, workd, workl, info_eupd] = dseupd(rvec, howmny, _select, d, z, sigma, bmat, nA, which, nev, tol, resid, ncv, v, iparam, ipntr, workd, workl, info_eupd);
@@ -621,7 +620,9 @@ function [res_d, res_v] = speigs(A, %_B, nev, which, maxiter, tol, ncv, cholB, r
                     index = find(di~=0);
                     index = index(1:2:$);
                     res_v = z;
-                    res_v(:,[index index+1]) = [complex(res_v(:,index),res_v(:,index+1)), complex(res_v(:,index),-res_v(:,index+1))];
+                    if ~isempty(index) then
+                        res_v(:,[index index+1]) = [complex(res_v(:,index),res_v(:,index+1)), complex(res_v(:,index),-res_v(:,index+1))];
+                    end
                     res_d = diag(res_d);
                     res_v = res_v(:,1:nev);
                 end
diff --git a/scilab/modules/arnoldi/tests/nonreg_tests/bug_12772.dia.ref b/scilab/modules/arnoldi/tests/nonreg_tests/bug_12772.dia.ref
new file mode 100644 (file)
index 0000000..a06a1d2
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+// <-- CLI SHELL MODE -->
+// <-- Non-regression test for bug 12772 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12772
+//
+// <-- Short Description -->
+//    eigs() failed when trying to solve a sparse matrix eigen value problem.
+// =============================================================================
+C1 = -51*eye(10,10);
+C1(1:$-1, 2:$) = C1(1:$-1,2:$) + diag(100*ones(9,1));
+C1(2:$,1:$-1) = C1(2:$,1:$-1) + diag(100*ones(9,1));
+C1(10,9) = 116;
+C1(10,10) = -147;
+C1 = sparse(C1);
+[d, v] = eigs(C1,sparse(eye(10,10)), 1, 480);
+assert_checkalmostequal(C1*v, v*d, sqrt(%eps), 1.e-10);
diff --git a/scilab/modules/arnoldi/tests/nonreg_tests/bug_12772.tst b/scilab/modules/arnoldi/tests/nonreg_tests/bug_12772.tst
new file mode 100644 (file)
index 0000000..45068c4
--- /dev/null
@@ -0,0 +1,27 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Adeline CARNIS
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- CLI SHELL MODE -->
+
+// <-- Non-regression test for bug 12772 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12772
+//
+// <-- Short Description -->
+//    eigs() failed when trying to solve a sparse matrix eigen value problem.
+// =============================================================================
+
+C1 = -51*eye(10,10);
+C1(1:$-1, 2:$) = C1(1:$-1,2:$) + diag(100*ones(9,1));
+C1(2:$,1:$-1) = C1(2:$,1:$-1) + diag(100*ones(9,1));
+C1(10,9) = 116;
+C1(10,10) = -147;
+C1 = sparse(C1);
+
+[d, v] = eigs(C1,sparse(eye(10,10)), 1, 480);
+assert_checkalmostequal(C1*v, v*d, sqrt(%eps), 1.e-10);