1 //------------------------------------------------------------------------------
2 // GB_mex_offdiag: compute C=offdiag(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 = offdiag (A,k), where A and C are double
11 
12 #include "GB_mex.h"
13 
14 #define USAGE "C = GB_mex_offdiag (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 
24 
mexFunction(int nargout,mxArray * pargout[],int nargin,const mxArray * pargin[])25 void mexFunction
26 (
27     int nargout,
28     mxArray *pargout [ ],
29     int nargin,
30     const mxArray *pargin [ ]
31 )
32 {
33 
34     bool malloc_debug = GB_mx_get_global (true) ;
35     GrB_Matrix A = NULL, C = NULL ;
36     GxB_Scalar Thunk = NULL ;
37 
38     // check inputs
39     if (nargout > 1 || nargin < 1 || nargin > 2)
40     {
41         mexErrMsgTxt ("Usage: " USAGE) ;
42     }
43 
44     #define GET_DEEP_COPY ;
45     #define FREE_DEEP_COPY ;
46 
47     // get A
48     A = GB_mx_mxArray_to_Matrix (pargin [0], "A", false, true) ;
49     if (A == NULL)
50     {
51         FREE_ALL ;
52         mexErrMsgTxt ("failed") ;
53     }
54 
55     int64_t k = 0 ;
56     // get k
57     if (nargin > 1)
58     {
59         k = (int64_t) mxGetScalar (pargin [1]) ;
60     }
61 
62     #define GET_DEEP_COPY ;
63     #define FREE_DEEP_COPY ;
64 
65     // construct C
66     METHOD (GrB_Matrix_new (&C, GrB_FP64, A->vlen, A->vdim)) ;
67 
68     #undef GET_DEEP_COPY
69     #undef FREE_DEEP_COPY
70 
71     #define GET_DEEP_COPY  GrB_Matrix_new (&C, GrB_FP64, A->vlen, A->vdim) ;
72     #define FREE_DEEP_COPY GrB_Matrix_free_(&C) ;
73 
74     GxB_Scalar_new (&Thunk, GrB_INT64) ;
75     GxB_Scalar_setElement_INT64_(Thunk, k) ;
76     GxB_Scalar_wait (&Thunk) ;
77 
78     // C = offdiag (A,k)
79     METHOD (GxB_Matrix_select_(C, NULL, NULL, GxB_OFFDIAG, A, Thunk, NULL)) ;
80 
81     // return C to MATLAB as a regular MATLAB sparse matrix
82     pargout [0] = GB_mx_Matrix_to_mxArray (&C, "C offdiag", false) ;
83 
84     FREE_ALL ;
85 }
86 
87