text: //------------------------------------------------------------------------------
  // GB_mex_tril: compute C=tril(A,1)
  //------------------------------------------------------------------------------
  
  // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2020, All Rights Reserved.
  // http://suitesparse.com   See GraphBLAS/Doc/License.txt for license.
  
  //------------------------------------------------------------------------------
  
  // C = tril (A,k), where A and C are double
  
  #include "GB_mex.h"
  
  #define USAGE "C = GB_mex_tril (A,k)"
  
  #define FREE_ALL                        \
  {                                       \
      GB_SCALAR_FREE (&Thunk) ;           \
      GB_MATRIX_FREE (&A) ;               \
      GB_MATRIX_FREE (&C) ;               \
      GB_mx_put_global (true, 0) ;        \
  }
  
  void mexFunction
  (
      int nargout,
      mxArray *pargout [ ],
      int nargin,
      const mxArray *pargin [ ]
  )
  {
  
      bool malloc_debug = GB_mx_get_global (true) ;
      GrB_Matrix A = NULL, C = NULL ;
      GxB_Scalar Thunk = NULL ;
  
      // check inputs
      GB_WHERE (USAGE) ;
      if (nargout > 1 || nargin < 1 || nargin > 2)
      {
          mexErrMsgTxt ("Usage: " USAGE) ;
      }
  
      // get A
      A = GB_mx_mxArray_to_Matrix (pargin [0], "A", false, true) ;
      if (A == NULL)
      {
          FREE_ALL ;
          mexErrMsgTxt ("failed") ;
      }
  
      int64_t k = 0 ;
      // get k
      if (nargin > 1)
      {
          k = (int64_t) mxGetScalar (pargin [1]) ;
      }
  
      #define GET_DEEP_COPY ;
      #define FREE_DEEP_COPY ;
  
      // construct C
      METHOD (GrB_Matrix_new (&C, GrB_FP64, A->vlen, A->vdim)) ;
  
      #undef GET_DEEP_COPY
      #undef FREE_DEEP_COPY
  
      #define GET_DEEP_COPY  GrB_Matrix_new (&C, GrB_FP64, A->vlen, A->vdim) ;
      #define FREE_DEEP_COPY GrB_Matrix_free (&C) ;
  
      GxB_Scalar_new (&Thunk, GrB_INT64) ;
      GxB_Scalar_setElement_INT64 (Thunk, k) ;
      GrB_Index ignore ;
      GxB_Scalar_nvals (&ignore, Thunk) ;
  
      // C = tril (A,k)
      METHOD (GxB_Matrix_select (C, NULL, NULL, GxB_TRIL, A, Thunk, NULL)) ;
  
      // return C to MATLAB as a regular MATLAB sparse matrix
      pargout [0] = GB_mx_Matrix_to_mxArray (&C, "C tril", false) ;
  
      FREE_ALL ;
  }
  
  