📄 explore.c
字号:
static void
analyze_uint16(const mxArray *array_ptr)
{
unsigned short int *pr, *pi;
int total_num_of_elements, index;
pr = (unsigned short int *)mxGetData(array_ptr);
pi = (unsigned short int *)mxGetImagData(array_ptr);
total_num_of_elements = mxGetNumberOfElements(array_ptr);
for (index=0; index<total_num_of_elements; index++) {
mexPrintf("\t");
display_subscript(array_ptr, index);
if (mxIsComplex(array_ptr))
mexPrintf(" = %u + %ui\n", *pr++, *pi++);
else
mexPrintf(" = %u\n", *pr++);
}
}
static void
analyze_int32(const mxArray *array_ptr)
{
int *pr, *pi;
int total_num_of_elements, index;
pr = (int *)mxGetData(array_ptr);
pi = (int *)mxGetImagData(array_ptr);
total_num_of_elements = mxGetNumberOfElements(array_ptr);
for (index=0; index<total_num_of_elements; index++) {
mexPrintf("\t");
display_subscript(array_ptr, index);
if (mxIsComplex(array_ptr))
mexPrintf(" = %d + %di\n", *pr++, *pi++);
else
mexPrintf(" = %d\n", *pr++);
}
}
static void
analyze_uint32(const mxArray *array_ptr)
{
unsigned int *pr, *pi;
int total_num_of_elements, index;
pr = (unsigned int *)mxGetData(array_ptr);
pi = (unsigned int *)mxGetImagData(array_ptr);
total_num_of_elements = mxGetNumberOfElements(array_ptr);
for (index=0; index<total_num_of_elements; index++) {
mexPrintf("\t");
display_subscript(array_ptr, index);
if (mxIsComplex(array_ptr))
mexPrintf(" = %u + %ui\n", *pr++, *pi++);
else
mexPrintf(" = %u\n", *pr++);
}
}
static void
analyze_single(const mxArray *array_ptr)
{
float *pr, *pi;
int total_num_of_elements, index;
pr = (float *)mxGetData(array_ptr);
pi = (float *)mxGetImagData(array_ptr);
total_num_of_elements = mxGetNumberOfElements(array_ptr);
for (index=0; index<total_num_of_elements; index++) {
mexPrintf("\t");
display_subscript(array_ptr, index);
if (mxIsComplex(array_ptr))
mexPrintf(" = %g + %gi\n", *pr++, *pi++);
else
mexPrintf(" = %g\n", *pr++);
}
}
static void
analyze_double(const mxArray *array_ptr)
{
double *pr, *pi;
int total_num_of_elements, index;
pr = mxGetPr(array_ptr);
pi = mxGetPi(array_ptr);
total_num_of_elements = mxGetNumberOfElements(array_ptr);
for (index=0; index<total_num_of_elements; index++) {
mexPrintf("\t");
display_subscript(array_ptr, index);
if (mxIsComplex(array_ptr))
mexPrintf(" = %g + %gi\n", *pr++, *pi++);
else
mexPrintf(" = %g\n", *pr++);
}
}
/* Pass analyze_full a pointer to any kind of numeric mxArray.
analyze_full figures out what kind of numeric mxArray this is. */
static void
analyze_full(const mxArray *numeric_array_ptr)
{
mxClassID category;
category = mxGetClassID(numeric_array_ptr);
switch (category) {
case mxINT8_CLASS: analyze_int8(numeric_array_ptr); break;
case mxUINT8_CLASS: analyze_uint8(numeric_array_ptr); break;
case mxINT16_CLASS: analyze_int16(numeric_array_ptr); break;
case mxUINT16_CLASS: analyze_uint16(numeric_array_ptr); break;
case mxINT32_CLASS: analyze_int32(numeric_array_ptr); break;
case mxUINT32_CLASS: analyze_uint32(numeric_array_ptr); break;
case mxSINGLE_CLASS: analyze_single(numeric_array_ptr); break;
case mxDOUBLE_CLASS: analyze_double(numeric_array_ptr); break;
}
}
/* Display the subscript associated with the given index. */
void
display_subscript(const mxArray *array_ptr, int index)
{
int inner, subindex, total, d, q;
int number_of_dimensions;
int *subscript;
const int *dims;
number_of_dimensions = mxGetNumberOfDimensions(array_ptr);
subscript = mxCalloc(number_of_dimensions, sizeof(int));
dims = mxGetDimensions(array_ptr);
mexPrintf("(");
subindex = index;
for (d = number_of_dimensions-1; d >= 0; d--) {
for (total=1, inner=0; inner<d; inner++)
total *= dims[inner];
subscript[d] = subindex / total;
subindex = subindex % total;
}
for (q=0; q<number_of_dimensions-1; q++)
mexPrintf("%d,", subscript[q] + 1);
mexPrintf("%d)", subscript[number_of_dimensions-1] + 1);
mxFree(subscript);
}
/* get_characteristics figures out the size, and category
of the input array_ptr, and then displays all this information. */
void
get_characteristics(const mxArray *array_ptr)
{
const char *name;
const char *class_name;
const int *dims;
char *shape_string;
char *temp_string;
int c;
int number_of_dimensions;
int length_of_shape_string;
/* Display the mxArray's Dimensions; for example, 5x7x3.
If the mxArray's Dimensions are too long to fit, then just
display the number of dimensions; for example, 12-D. */
number_of_dimensions = mxGetNumberOfDimensions(array_ptr);
dims = mxGetDimensions(array_ptr);
/* alloc memory for shape_string w.r.t thrice the number of dimensions */
/* (so that we can also add the 'x') */
shape_string=(char *)mxCalloc(number_of_dimensions*3,sizeof(char));
shape_string[0]='\0';
temp_string=(char *)mxCalloc(64, sizeof(char));
for (c=0; c<number_of_dimensions; c++) {
sprintf(temp_string, "%dx", dims[c]);
strcat(shape_string, temp_string);
}
length_of_shape_string = strlen(shape_string);
/* replace the last 'x' with a space */
shape_string[length_of_shape_string-1]='\0';
if (length_of_shape_string > 16)
sprintf(shape_string, "%d-D\0", number_of_dimensions);
mexPrintf("Dimensions: %s\n", shape_string);
/* Display the mxArray's class (category). */
class_name = mxGetClassName(array_ptr);
mexPrintf("Class Name: %s%s\n", class_name,
mxIsSparse(array_ptr) ? " (sparse)" : "");
/* Display a bottom banner. */
mexPrintf("------------------------------------------------\n");
/* free up memory for shape_string */
mxFree(shape_string);
}
/* Determine the category (class) of the input array_ptr, and then
branch to the appropriate analysis routine. */
mxClassID
analyze_class(const mxArray *array_ptr)
{
mxClassID category;
category = mxGetClassID(array_ptr);
if (mxIsSparse(array_ptr)) {
analyze_sparse(array_ptr);
} else {
switch (category) {
case mxCHAR_CLASS: analyze_string(array_ptr); break;
case mxSTRUCT_CLASS: analyze_structure(array_ptr); break;
case mxCELL_CLASS: analyze_cell(array_ptr); break;
case mxUNKNOWN_CLASS: mexWarnMsgTxt("Unknown class."); break;
default: analyze_full(array_ptr); break;
}
}
return(category);
}
/* mexFunction is the gateway routine for the MEX-file. */
void
mexFunction( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )
{
int i;
/* Look at each input (right-hand-side) argument. */
for (i=0; i<nrhs; i++) {
mexPrintf("\n\n");
/* Display a top banner. */
mexPrintf("------------------------------------------------\n");
/* Display which argument */
mexPrintf("Name: %s%d%c\n", "prhs[",i,']');
get_characteristics(prhs[i]);
analyze_class(prhs[i]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -