code: def matmul(
      a: Union[torch.Tensor, ComplexTensor],
      b: Union[torch.Tensor, ComplexTensor],
  ) -> Union[torch.Tensor, ComplexTensor]:
      # NOTE: Do not mix ComplexTensor and torch.complex in the input!
      # NOTE (wangyou): Until PyTorch 1.9.0, torch.matmul does not support
      # multiplication between complex and real tensors.
      if isinstance(a, ComplexTensor) or isinstance(b, ComplexTensor):
          return FC.matmul(a, b)
      elif torch.is_complex(a) or torch.is_complex(b):
          if not torch.is_complex(a):
              o_real = torch.matmul(a, b.real)
              o_imag = torch.matmul(a, b.imag)
              return torch.complex(o_real, o_imag)
          elif not torch.is_complex(b):
              o_real = torch.matmul(a.real, b)
              o_imag = torch.matmul(a.imag, b)
              return torch.complex(o_real, o_imag)
          else:
              return torch.matmul(a, b)
      else:
          return torch.matmul(a, b)
  
file_path: espnet/espnet2/enh/layers/complex_utils.py
imports: from typing import Sequence, Tuple, Union
  import torch
  from torch_complex import functional
  from torch_complex.tensor import ComplexTensor
label_desc: Use image node_id 11 for calling a global function with example usage: matmul(a, b) and returns: FC, torch, torch, torch, torch