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