code: def spectral_moments(self, num_moments, R):
      eigval_powers = hl.nd.vstack(
          [
              self.S.map(lambda x: x ** (2 * i))
              for i in range(1, num_moments + 1)
          ]
      )
      moments = eigval_powers @ (self.V1t[:, : self.k] @ R).map(
          lambda x: x**2
      )
      means = moments.sum(1) / self.k
      variances = (moments - means.reshape(-1, 1)).map(
          lambda x: x**2
      ).sum(1) / (self.k - 1)
      stdevs = variances.map(lambda x: hl.sqrt(x))
      return hl.struct(moments=means, stdevs=stdevs)
  
imports: from typing import List, Tuple
  import hail
  import hail.expr.aggregators
  from hail.expr.expressions import construct_expr
  from hail.expr import expr_float64, expr_call, raise_unless_entry_indexed, matrix_table_source
  from hail import ir
  from hail.table import Table
  from hail.typecheck import typecheck, oneof, nullable
  from hail.utils import FatalError
  from hail.utils.java import Env, info
  from hail.experimental import mt_to_table_of_ndarray
label_desc: Use image node_id 3 for calling the KrylovFactorization obj's underlying member method code with example usage: obj.spectral_moments(num_moments, R) and returns: hl