static void print_default_numeric_3d(matvar_t *matvar) { size_t i, j, k, l, stride; stride = Mat_SizeOf(matvar->data_type); if ( matvar->isComplex ) { mat_complex_split_t *complex_data = matvar->data; char *rp = complex_data->Re; char *ip = complex_data->Im; for ( k = 0; k < matvar->dims[2]; k++ ) { Mat_Message("%s(:,:,%lu) = ",matvar->name,k); indent++; for ( i = 0; i < matvar->dims[0]; i++ ) { for ( l = 0; l < indent; l++ ) printf(" "); for ( j = 0; j < matvar->dims[1]; j++ ) { size_t idx = matvar->dims[0]*matvar->dims[1]*k+matvar->dims[0]*j+i; print_default_number(matvar->data_type,rp+idx*stride); printf(" + "); print_default_number(matvar->data_type,ip+idx*stride); printf("i "); } printf("\n"); } indent--; printf("\n"); } } else { char *data = matvar->data; for ( k = 0; k < matvar->dims[2]; k++ ) { Mat_Message("%s(:,:,%lu) = ",matvar->name,k); indent++; for ( i = 0; i < matvar->dims[0]; i++ ) { for ( l = 0; l < indent; l++ ) printf(" "); for ( j = 0; j < matvar->dims[1]; j++ ) { size_t idx = matvar->dims[0]*matvar->dims[1]*k+matvar->dims[0]*j+i; print_default_number(matvar->data_type, data+idx*stride); printf(" "); } printf("\n"); } indent--; printf("\n"); } } }
static void print_default_numeric_2d(matvar_t *matvar) { size_t i, j, stride; if ( NULL == matvar->data ) return; stride = Mat_SizeOf(matvar->data_type); if ( matvar->isComplex ) { mat_complex_split_t *complex_data = matvar->data; char *rp = complex_data->Re; char *ip = complex_data->Im; for ( i = 0; i < matvar->dims[0]; i++ ) { for ( j = 0; j < matvar->dims[1]; j++ ) { size_t idx = matvar->dims[0]*j+i; print_default_number(matvar->data_type,rp+idx*stride); printf(" + "); print_default_number(matvar->data_type,ip+idx*stride); printf("i "); } printf("\n"); } } else { char *data = matvar->data; for ( i = 0; i < matvar->dims[0]; i++ ) { for ( j = 0; j < matvar->dims[1]; j++ ) { size_t idx = matvar->dims[0]*j+i; print_default_number(matvar->data_type, data+idx*stride); printf(" "); } printf("\n"); } } }
/** @if mat_devman * @brief Reads the header information for the next MAT variable in a version 4 MAT file * * @ingroup mat_internal * @param mat MAT file pointer * @retuen pointer to the MAT variable or NULL * @endif */ matvar_t * Mat_VarReadNextInfo4(mat_t *mat) { int tmp; int M,O; long nBytes; size_t err; matvar_t *matvar = NULL; if ( mat == NULL || mat->fp == NULL ) return NULL; else if ( NULL == (matvar = Mat_VarCalloc()) ) return NULL; matvar->internal->fp = mat; matvar->internal->fpos = ftell(mat->fp); err = fread(&tmp,sizeof(int),1,mat->fp); if ( !err ) { free(matvar); return NULL; } M = floor(tmp / 1000.0); tmp -= M*1000; O = floor(tmp / 100.0); tmp -= O*100; matvar->data_type = floor(tmp / 10.0); tmp -= matvar->data_type*10; /* Convert the V4 data type */ switch ( matvar->data_type ) { case 0: matvar->data_type = MAT_T_DOUBLE; break; case 1: matvar->data_type = MAT_T_SINGLE; break; case 2: matvar->data_type = MAT_T_INT32; break; case 3: matvar->data_type = MAT_T_INT16; break; case 4: matvar->data_type = MAT_T_UINT16; break; case 5: matvar->data_type = MAT_T_UINT8; break; default: matvar->data_type = -1; break; } matvar->class_type = floor(tmp); switch ( matvar->class_type ) { case 0: matvar->class_type = MAT_C_DOUBLE; break; case 1: matvar->class_type = MAT_C_CHAR; break; case 2: matvar->class_type = MAT_C_SPARSE; break; default: break; } matvar->rank = 2; /* FIXME: Check allocation */ matvar->dims = malloc(2*sizeof(int)); err = fread(matvar->dims,sizeof(int),1,mat->fp); if ( !err ) { Mat_VarFree(matvar); return NULL; } err = fread(matvar->dims+1,sizeof(int),1,mat->fp); if ( !err ) { Mat_VarFree(matvar); return NULL; } err = fread(&(matvar->isComplex),sizeof(int),1,mat->fp); if ( !err ) { Mat_VarFree(matvar); return NULL; } err = fread(&tmp,sizeof(int),1,mat->fp); if ( !err ) { Mat_VarFree(matvar); return NULL; } /* FIXME: Check allocation */ matvar->name = malloc(tmp); err = fread(matvar->name,1,tmp,mat->fp); if ( !err ) { Mat_VarFree(matvar); return NULL; } matvar->internal->datapos = ftell(mat->fp); nBytes = matvar->dims[0]*matvar->dims[1]*Mat_SizeOf(matvar->data_type); if ( matvar->isComplex ) nBytes *= 2; fseek(mat->fp,nBytes,SEEK_CUR); return matvar; }
/** @if mat_devman * @brief Reads a slab of data from a version 4 MAT file for the @c matvar variable * * @ingroup mat_internal * @param mat Version 4 MAT file pointer * @param matvar pointer to the mat variable * @param data pointer to store the read data in (must be of size * edge[0]*...edge[rank-1]*Mat_SizeOfClass(matvar->class_type)) * @param start index to start reading data in each dimension * @param stride write data every @c stride elements in each dimension * @param edge number of elements to read in each dimension * @retval 0 on success * @endif */ int ReadData4(mat_t *mat,matvar_t *matvar,void *data, int *start,int *stride,int *edge) { int err = 0, class_type; fseek(mat->fp,matvar->internal->datapos,SEEK_SET); switch( matvar->data_type ) { case MAT_T_DOUBLE: class_type = MAT_C_DOUBLE; break; case MAT_T_SINGLE: class_type = MAT_C_SINGLE; break; case MAT_T_INT32: class_type = MAT_C_INT32; break; case MAT_T_INT16: class_type = MAT_C_INT16; break; case MAT_T_UINT16: class_type = MAT_C_UINT16; break; case MAT_T_UINT8: class_type = MAT_C_UINT8; break; default: break; } if ( matvar->rank == 2 ) { if ( stride[0]*(edge[0]-1)+start[0]+1 > matvar->dims[0] ) err = 1; else if ( stride[1]*(edge[1]-1)+start[1]+1 > matvar->dims[1] ) err = 1; if ( matvar->isComplex ) { struct ComplexSplit *cdata = data; long nbytes = edge[0]*edge[1]*Mat_SizeOf(matvar->data_type); ReadDataSlab2(mat,cdata->Re,class_type,matvar->data_type, matvar->dims,start,stride,edge); fseek(mat->fp,matvar->internal->datapos+nbytes,SEEK_SET); ReadDataSlab2(mat,cdata->Im,class_type, matvar->data_type,matvar->dims,start,stride,edge); } else { ReadDataSlab2(mat,data,class_type,matvar->data_type, matvar->dims,start,stride,edge); } } else { if ( matvar->isComplex ) { int i; struct ComplexSplit *cdata = data; long nbytes = Mat_SizeOf(matvar->data_type); for ( i = 0; i < matvar->rank; i++ ) nbytes *= edge[i]; ReadDataSlabN(mat,cdata->Re,class_type,matvar->data_type, matvar->rank,matvar->dims,start,stride,edge); fseek(mat->fp,matvar->internal->datapos+nbytes,SEEK_SET); ReadDataSlab2(mat,cdata->Im,class_type, matvar->data_type,matvar->dims,start,stride,edge); } else { ReadDataSlabN(mat,data,class_type,matvar->data_type, matvar->rank,matvar->dims,start,stride,edge); } } return err; }