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