Skip to content

Commit 7e18e4d

Browse files
committed
Add support for all types to Matlab.
1 parent a0898df commit 7e18e4d

File tree

1 file changed

+60
-29
lines changed

1 file changed

+60
-29
lines changed

bindings/matlab/binsparse_read.c

Lines changed: 60 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)