1 //------------------------------------------------------------------------------
2 // GB_mex_triu: compute C=triu(A,1)
3 //------------------------------------------------------------------------------
4 
5 // SuiteSparse:GraphBLAS, Timothy A. Davis, (c) 2017-2021, All Rights Reserved.
6 // SPDX-License-Identifier: Apache-2.0
7 
8 //------------------------------------------------------------------------------
9 
10 // C = triu (A,k), where A and C are double
11 
12 #include "GB_mex.h"
13 
14 #define USAGE "C = GB_mex_triu (A,k)"
15 
16 #define FREE_ALL                        \
17 {                                       \
18     GxB_Scalar_free_(&Thunk) ;          \
19     GrB_Matrix_free_(&A) ;              \
20     GrB_Matrix_free_(&C) ;              \
21     GB_mx_put_global (true) ;           \
22 }
23 
mexFunction(int nargout,mxArray * pargout[],int nargin,const mxArray * pargin[])24 void mexFunction
25 (
26     int nargout,
27     mxArray *pargout [ ],
28     int nargin,
29     const mxArray *pargin [ ]
30 )
31 {
32 
33     bool malloc_debug = GB_mx_get_global (true) ;
34     GrB_Matrix A = NULL, C = NULL ;
35     GxB_Scalar Thunk = NULL ;
36 
37     // check inputs
38     if (nargout > 1 || nargin < 1 || nargin > 2)
39     {
40         mexErrMsgTxt ("Usage: " USAGE) ;
41     }
42 
43     // get A
44     A = GB_mx_mxArray_to_Matrix (pargin [0], "A", false, true) ;
45     if (A == NULL)
46     {
47         FREE_ALL ;
48         mexErrMsgTxt ("failed") ;
49     }
50 
51     int64_t k = 0 ;
52     // get k
53     if (nargin > 1)
54     {
55         k = (int64_t) mxGetScalar (pargin [1]) ;
56     }
57 
58     #define GET_DEEP_COPY ;
59     #define FREE_DEEP_COPY ;
60 
61     // construct C
62     METHOD (GrB_Matrix_new (&C, GrB_FP64, A->vlen, A->vdim)) ;
63 
64     #undef GET_DEEP_COPY
65     #undef FREE_DEEP_COPY
66 
67     #define GET_DEEP_COPY  GrB_Matrix_new (&C, GrB_FP64, A->vlen, A->vdim) ;
68     #define FREE_DEEP_COPY GrB_Matrix_free_(&C) ;
69 
70     GxB_Scalar_new (&Thunk, GrB_INT64) ;
71     GxB_Scalar_setElement_INT64_(Thunk, k) ;
72     GxB_Scalar_wait_(&Thunk) ;
73 
74     // C = triu (A,k)
75     METHOD (GxB_Matrix_select_(C, NULL, NULL, GxB_TRIU, A, Thunk, NULL)) ;
76 
77     // return C to MATLAB as a regular MATLAB sparse matrix
78     pargout [0] = GB_mx_Matrix_to_mxArray (&C, "C triu", false) ;
79 
80     FREE_ALL ;
81 }
82 
83