PDL-IO-Matlab
view release on metacpan or search on metacpan
matio-1.5.0/src/mat4.c view on Meta::CPAN
matvar->data_type = MAT_T_UINT8;
break;
default:
Mat_Critical("MAT V4 data type error");
return;
}
return;
}
/** @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;
enum matio_classes class_type = MAT_C_EMPTY;
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;
}
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 ) {
mat_complex_split_t *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;
mat_complex_split_t *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;
}
/** @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,M,O,data_type,class_type;
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;
}
/* See if MOPT may need byteswapping */
if ( tmp < 0 || tmp > 4052 ) {
if ( Mat_int32Swap(&tmp) > 4052 ) {
Mat_VarFree(matvar);
return NULL;
}
}
M = floor(tmp / 1000.0);
tmp -= M*1000;
O = floor(tmp / 100.0);
tmp -= O*100;
data_type = floor(tmp / 10.0);
tmp -= data_type*10;
class_type = floor(tmp);
mat->byteswap = (M == 1) ? 1 : 0;
/* Convert the V4 data type */
switch ( data_type ) {
case 0:
matvar->data_type = MAT_T_DOUBLE;
( run in 0.450 second using v1.01-cache-2.11-cpan-df04353d9ac )