@@ -32,52 +32,83 @@ mxArray* bsp_array_to_matlab(const bsp_array_t* array) {
3232
3333 switch (array -> type ) {
3434 case BSP_FLOAT64 :
35- mx_array = mxCreateDoubleMatrix (array -> size , 1 , mxREAL );
35+ mx_array = mxCreateNumericMatrix (array -> size , 1 , mxDOUBLE_CLASS , mxREAL );
3636 memcpy (mxGetPr (mx_array ), array -> data , array -> size * sizeof (double ));
3737 break ;
3838
39- case BSP_FLOAT32 : {
40- mx_array = mxCreateDoubleMatrix (array -> size , 1 , mxREAL );
41- double * out_data = mxGetPr (mx_array );
42- float * in_data = (float * ) array -> data ;
43- for (size_t i = 0 ; i < array -> size ; i ++ ) {
44- out_data [i ] = (double ) in_data [i ];
45- }
39+ case BSP_FLOAT32 :
40+ mx_array = mxCreateNumericMatrix (array -> size , 1 , mxSINGLE_CLASS , mxREAL );
41+ memcpy (mxGetData (mx_array ), array -> data , array -> size * sizeof (float ));
4642 break ;
47- }
4843
49- case BSP_UINT64 : {
44+ case BSP_UINT64 :
5045 mx_array = mxCreateNumericMatrix (array -> size , 1 , mxUINT64_CLASS , mxREAL );
5146 memcpy (mxGetData (mx_array ), array -> data , array -> size * sizeof (uint64_t ));
5247 break ;
53- }
5448
55- case BSP_UINT32 : {
56- mx_array = mxCreateNumericMatrix (array -> size , 1 , mxUINT64_CLASS , mxREAL );
57- uint64_t * out_data = (uint64_t * ) mxGetData (mx_array );
58- uint32_t * in_data = (uint32_t * ) array -> data ;
59- for (size_t i = 0 ; i < array -> size ; i ++ ) {
60- out_data [i ] = (uint64_t ) in_data [i ];
61- }
49+ case BSP_UINT32 :
50+ mx_array = mxCreateNumericMatrix (array -> size , 1 , mxUINT32_CLASS , mxREAL );
51+ memcpy (mxGetData (mx_array ), array -> data , array -> size * sizeof (uint32_t ));
6252 break ;
63- }
6453
65- case BSP_UINT16 : {
66- mx_array = mxCreateNumericMatrix (array -> size , 1 , mxUINT64_CLASS , mxREAL );
67- uint64_t * out_data = (uint64_t * ) mxGetData (mx_array );
68- uint16_t * in_data = (uint16_t * ) array -> data ;
54+ case BSP_UINT16 :
55+ mx_array = mxCreateNumericMatrix (array -> size , 1 , mxUINT16_CLASS , mxREAL );
56+ memcpy (mxGetData (mx_array ), array -> data , array -> size * sizeof (uint16_t ));
57+ break ;
58+
59+ case BSP_UINT8 :
60+ mx_array = mxCreateNumericMatrix (array -> size , 1 , mxUINT8_CLASS , mxREAL );
61+ memcpy (mxGetData (mx_array ), array -> data , array -> size * sizeof (uint8_t ));
62+ break ;
63+
64+ case BSP_INT64 :
65+ mx_array = mxCreateNumericMatrix (array -> size , 1 , mxINT64_CLASS , mxREAL );
66+ memcpy (mxGetData (mx_array ), array -> data , array -> size * sizeof (int64_t ));
67+ break ;
68+
69+ case BSP_INT32 :
70+ mx_array = mxCreateNumericMatrix (array -> size , 1 , mxINT32_CLASS , mxREAL );
71+ memcpy (mxGetData (mx_array ), array -> data , array -> size * sizeof (int32_t ));
72+ break ;
73+
74+ case BSP_INT16 :
75+ mx_array = mxCreateNumericMatrix (array -> size , 1 , mxINT16_CLASS , mxREAL );
76+ memcpy (mxGetData (mx_array ), array -> data , array -> size * sizeof (int16_t ));
77+ break ;
78+
79+ case BSP_INT8 :
80+ mx_array = mxCreateNumericMatrix (array -> size , 1 , mxINT8_CLASS , mxREAL );
81+ memcpy (mxGetData (mx_array ), array -> data , array -> size * sizeof (int8_t ));
82+ break ;
83+
84+ case BSP_BINT8 :
85+ // Treat BSP_BINT8 as UINT8 as suggested
86+ mx_array = mxCreateNumericMatrix (array -> size , 1 , mxUINT8_CLASS , mxREAL );
87+ memcpy (mxGetData (mx_array ), array -> data , array -> size * sizeof (int8_t ));
88+ break ;
89+
90+ case BSP_COMPLEX_FLOAT64 : {
91+ mx_array = mxCreateNumericMatrix (array -> size , 1 , mxDOUBLE_CLASS , mxCOMPLEX );
92+ double * in_data =
93+ (double * ) array -> data ; // Treat as array of adjacent real/imag pairs
94+ double * real_data = mxGetPr (mx_array );
95+ double * imag_data = mxGetPi (mx_array );
6996 for (size_t i = 0 ; i < array -> size ; i ++ ) {
70- out_data [i ] = (uint64_t ) in_data [i ];
97+ real_data [i ] = in_data [2 * i ]; // Real part
98+ imag_data [i ] = in_data [2 * i + 1 ]; // Imaginary part
7199 }
72100 break ;
73101 }
74102
75- case BSP_UINT8 : {
76- mx_array = mxCreateNumericMatrix (array -> size , 1 , mxUINT64_CLASS , mxREAL );
77- uint64_t * out_data = (uint64_t * ) mxGetData (mx_array );
78- uint8_t * in_data = (uint8_t * ) array -> data ;
103+ case BSP_COMPLEX_FLOAT32 : {
104+ mx_array = mxCreateNumericMatrix (array -> size , 1 , mxSINGLE_CLASS , mxCOMPLEX );
105+ float * in_data =
106+ (float * ) array -> data ; // Treat as array of adjacent real/imag pairs
107+ float * real_data = (float * ) mxGetData (mx_array );
108+ float * imag_data = (float * ) mxGetImagData (mx_array );
79109 for (size_t i = 0 ; i < array -> size ; i ++ ) {
80- out_data [i ] = (uint64_t ) in_data [i ];
110+ real_data [i ] = in_data [2 * i ]; // Real part
111+ imag_data [i ] = in_data [2 * i + 1 ]; // Imaginary part
81112 }
82113 break ;
83114 }
0 commit comments