comparison scripts/sparse/eigs.m @ 29077:b85f72ec844a

eigs.m: Add error when requested number of eigenvalues K exceeds number possible. * eigs.m (select): Check that number of eigenvalues requested (k) is less than number possible (n). * eigs.m: Add BIST tests for input validation.
author Rik <rik@octave.org>
date Thu, 19 Nov 2020 15:20:42 -0800
parents fa2cdef14442
children a23870bdf30e
comparison
equal deleted inserted replaced
29076:fa2cdef14442 29077:b85f72ec844a
375 375
376 d = d(idx); 376 d = d(idx);
377 377
378 n = numel (d); 378 n = numel (d);
379 379
380 k = min (k, n); 380 if (k > n)
381 error ("eigs: requested number of eigenvalues K (%d) exceeds available eigenvalues (%d)", k, n);
382 endif
381 383
382 if (strcmp (sigma, "be")) 384 if (strcmp (sigma, "be"))
383 tmp = k / 2; 385 tmp = k / 2;
384 n1 = floor (tmp); 386 n1 = floor (tmp);
385 n2 = n - ceil (tmp) + 1; 387 n2 = n - ceil (tmp) + 1;
1368 %! assert (max (tmp(:)) < 5e-11); 1370 %! assert (max (tmp(:)) < 5e-11);
1369 1371
1370 %!assert (eigs (diag (1:5), 5, "sa"), [1;2;3;4;5]) # call_eig is true 1372 %!assert (eigs (diag (1:5), 5, "sa"), [1;2;3;4;5]) # call_eig is true
1371 %!assert (eigs (diag (1:5), 5, "la"), [5;4;3;2;1]) # call_eig is true 1373 %!assert (eigs (diag (1:5), 5, "la"), [5;4;3;2;1]) # call_eig is true
1372 %!assert (eigs (diag (1:5), 3, "be"), [1;4;5]) # call_eig is true 1374 %!assert (eigs (diag (1:5), 3, "be"), [1;4;5]) # call_eig is true
1373 %!error
1374 %! A = rand (10);
1375 %! opts.v0 = ones (8, 1);
1376 %! eigs (A, 4, "sm", opts);
1377 %!testif HAVE_ARPACK 1375 %!testif HAVE_ARPACK
1378 %! A = toeplitz ([-2, 1, zeros(1, 8)]); 1376 %! A = toeplitz ([-2, 1, zeros(1, 8)]);
1379 %! A = kron (A, eye (10)) + kron (eye (10), A); 1377 %! A = kron (A, eye (10)) + kron (eye (10), A);
1380 %! opts.v0 = (1:100)'; 1378 %! opts.v0 = (1:100)';
1381 %! opts.maxit = 3; 1379 %! opts.maxit = 3;
1588 1586
1589 %!testif HAVE_ARPACK <*59486> 1587 %!testif HAVE_ARPACK <*59486>
1590 %! A = magic (5); 1588 %! A = magic (5);
1591 %! d = eigs (A, [], 1); 1589 %! d = eigs (A, [], 1);
1592 %! assert (d, 65, 150*eps); 1590 %! assert (d, 65, 150*eps);
1591
1592 ## Test input validation
1593 %!error <Invalid call> eigs ()
1594 %!error <requested number of eigenvalues K \(2\) exceeds available eigenvalues \(1\)>
1595 %! eigs (1, [], 2);
1596 %!error <"la" requires real symmetric problem> eigs ([i,0;0,1], 1, "la")
1597 %!error <"la" requires real symmetric problem> eigs ([1,1;0,1], 1, "la")
1598 %!error <"sa" requires real symmetric problem> eigs ([i,0;0,1], 1, "sa")
1599 %!error <"sa" requires real symmetric problem> eigs ([1,1;0,1], 1, "sa")
1600 %!error <"be" requires real symmetric problem> eigs ([i,0;0,1], 1, "be")
1601 %!error <"be" requires real symmetric problem> eigs ([1,1;0,1], 1, "be")
1602 %!error <"lr" requires complex or unsymmetric> eigs ([1,0;0,1], 1, "lr")
1603 %!error <"sr" requires complex or unsymmetric> eigs ([1,0;0,1], 1, "sr")
1604 %!error <"li" requires complex or unsymmetric> eigs ([1,0;0,1], 1, "li")
1605 %!error <"si" requires complex or unsymmetric> eigs ([1,0;0,1], 1, "si")
1606 %!error <unrecognized value for SIGMA: foobar> eigs (eye (2), 1, "foobar")
1607 %!error <opts.v0 must be n-by-1>
1608 %! A = rand (10);
1609 %! opts.v0 = ones (8, 1);
1610 %! eigs (A, 4, "sm", opts);