182#if defined (HAVE_ARPACK)
184 int nargin = args.
length ();
191 std::string fcn_name;
195 double sigmar, sigmai;
196 bool have_sigma =
false;
197 std::string typ =
"LM";
204 bool have_a_fcn =
false;
205 bool a_is_complex =
false;
206 bool b_is_complex =
false;
207 bool symmetric =
false;
208 bool sym_tested =
false;
210 bool a_is_sparse =
false;
211 bool b_is_sparse =
false;
214 double tol = std::numeric_limits<double>::epsilon ();
222 eigs_callback callback (interp);
228 error (
"eigs: invalid recursive call");
230 if (args(0).is_function_handle () || args(0).is_inline_function ()
231 || args(0).is_string ())
236 if (callback.m_eigs_fcn.is_undefined ())
237 error (
"eigs: unknown function");
239 error (
"eigs: incorrect number of arguments");
241 n = args(1).strict_int_value ();
247 if (args(0).iscomplex ())
250 if (args(0).issparse ())
253 ascm = args(0).sparse_complex_matrix_value ();
256 error (
"eigs: matrix A contains Inf or NaN values");
260 acm = args(0).complex_matrix_value ();
262 error (
"eigs: matrix A contains Inf or NaN values");
267 if (args(0).issparse ())
270 asmm = args(0).sparse_matrix_value ();
272 error (
"eigs: matrix A contains Inf or NaN values");
276 amm = args(0).matrix_value ();
278 error (
"eigs: matrix A contains Inf or NaN values");
285 if (nargin > (1+arg_offset) && ! args(1+arg_offset).is_real_scalar ())
288 b_arg = 1 + arg_offset;
289 if (args(b_arg).iscomplex ())
292 if (args(b_arg).issparse ())
297 if (args(b_arg).issparse ())
303 if (nargin > (1+arg_offset))
304 k = args(1+arg_offset).strict_int_value ();
306 if (nargin > (2+arg_offset))
308 if (args(2+arg_offset).is_string ())
310 typ = args(2+arg_offset).string_value ();
312 transform (typ.begin (), typ.end (), typ.begin (), toupper);
319 sigma = args(2+arg_offset).xcomplex_value (
"eigs: SIGMA must be a scalar or a string");
323 sigmar = sigma.real ();
324 sigmai = sigma.imag ();
326 if (nargin > (3+arg_offset))
328 if (! args(3+arg_offset).isstruct ())
329 error (
"eigs: OPTS argument must be a structure");
331 octave_scalar_map map = args(3+arg_offset).xscalar_map_value (
"eigs: OPTS argument must be a scalar structure");
339 if (tmp.
numel () != 1)
340 error (
"eigs: OPTS.issym must be a scalar value");
352 if (tmp.
numel () != 1)
353 error (
"eigs: OPTS.isreal must be a scalar value");
355 a_is_complex = ! tmp.
strict_bool_value (
"eigs: OPTS.isreal must be a logical value");
374 if (a_is_complex || b_is_complex)
387 if (tmp.
numel () != 1)
388 error (
"eigs: OPTS.cholB must be a scalar value");
398 if (nargin > (4+arg_offset))
399 error (
"eigs: incorrect number of arguments");
402 if (! sym_tested && ! have_a_fcn)
423 if (a_is_complex || b_is_complex)
427 bscm = args(b_arg).sparse_complex_matrix_value ();
430 error (
"eigs: matrix A contains Inf or NaN values");
434 bcm = args(b_arg).complex_matrix_value ();
436 error (
"eigs: matrix B contains Inf or NaN values");
443 bsmm = args(b_arg).sparse_matrix_value ();
445 error (
"eigs: matrix B contains Inf or NaN values");
449 bmm = args(b_arg).matrix_value ();
451 error (
"eigs: matrix B contains Inf or NaN values");
458 if (! have_sigma && typ ==
"SM")
462 if (a_is_complex || b_is_complex)
468 return callback.eigs_complex_func (
x, eigs_error);
478 (eigs_complex_fcn, n, typ, sigma, k, p, info, eig_vec,
480 (nargout > 1), cholB, disp, maxit);
483 (eigs_complex_fcn, n, typ, sigma, k, p, info, eig_vec,
485 (nargout > 1), cholB, disp, maxit);
491 (ascm, sigma, k, p, info, eig_vec, eig_val, bscm, permB,
496 (acm, sigma, k, p, info, eig_vec, eig_val, bcm, permB,
504 (ascm, typ, k, p, info, eig_vec, eig_val, bscm, permB,
509 (acm, typ, k, p, info, eig_vec, eig_val, bcm, permB,
517 retval(0) =
real (eig_val);
529 else if (sigmai != 0.0)
535 return callback.eigs_complex_func (
x, eigs_error);
546 (eigs_complex_fcn, n, typ, sigma, k, p, info, eig_vec,
548 (nargout > 1), cholB, disp, maxit);
551 (eigs_complex_fcn, n, typ, sigma, k, p, info, eig_vec,
553 (nargout > 1), cholB, disp, maxit);
572 retval(0) =
real (eig_val);
588 return callback.eigs_func (
x, eigs_error);
600 (eigs_fcn, n, typ, sigmar, k, p, info, eig_vec,
602 (nargout > 1), cholB, disp, maxit);
605 (eigs_fcn, n, typ, sigmar, k, p, info, eig_vec,
607 (nargout > 1), cholB, disp, maxit);
613 (asmm, sigmar, k, p, info, eig_vec, eig_val, bsmm,
618 (amm, sigmar, k, p, info, eig_vec, eig_val, bmm,
626 (asmm, typ, k, p, info, eig_vec, eig_val, bsmm,
631 (amm, typ, k, p, info, eig_vec, eig_val, bmm, permB,
650 (eigs_fcn, n, typ, sigmar, k, p, info, eig_vec,
652 (nargout > 1), cholB, disp, maxit);
655 (eigs_fcn, n, typ, sigmar, k, p, info, eig_vec,
657 (nargout > 1), cholB, disp, maxit);
663 (asmm, sigmar, k, p, info, eig_vec, eig_val, bsmm,
668 (amm, sigmar, k, p, info, eig_vec, eig_val, bmm,
676 (asmm, typ, k, p, info, eig_vec, eig_val, bsmm,
681 (amm, typ, k, p, info, eig_vec, eig_val, bmm, permB,
695 "eigs: None of the %" OCTAVE_IDX_TYPE_FORMAT
696 " requested eigenvalues converged", k);
699 "eigs: Only %" OCTAVE_IDX_TYPE_FORMAT
700 " of the %" OCTAVE_IDX_TYPE_FORMAT
701 " requested eigenvalues converged",
704 if (! fcn_name.empty ())
715 octave_unused_parameter (interp);
716 octave_unused_parameter (args);
717 octave_unused_parameter (nargout);