class_docstr: SpLuInv:
     helper class to repeatedly solve M*x=b
     using a sparse LU-decomposition of M
code: def _matvec(self, x):
      # careful here: splu.solve will throw away imaginary
      # part of x if M is real
      x = np.asarray(x)
      if self.isreal and np.issubdtype(x.dtype, np.complexfloating):
          return self.M_lu.solve(
              np.real(x).astype(self.dtype)
          ) + 1j * self.M_lu.solve(np.imag(x).astype(self.dtype))
      else:
          return self.M_lu.solve(x.astype(self.dtype))
  
imports: from .None import _arpack
  import numpy
  import warnings
  from scipy.sparse.linalg.interface import aslinearoperator, LinearOperator
  from scipy.sparse import eye, issparse, isspmatrix, isspmatrix_csr
  from scipy.linalg import eig, eigh, lu_factor, lu_solve
  from scipy.sparse.sputils import isdense, is_pydata_spmatrix
  from scipy.sparse.linalg import gmres, splu
  from scipy.sparse.linalg.eigen.lobpcg import lobpcg
  from scipy._lib._util import _aligned_zeros
  from scipy._lib._threadsafety import ReentrancyLock
label_desc: Use image node_id 2 for calling the SpLuInv obj's underlying member method code with example usage: obj._matvec(x) and returns: unknown, self