function tensors = readTensors(filename, toPermute)

if ~exist('toPermute','var')
    toPermute = true;
end

% use this function to load .tensor files (features or weights) into Matlab

count = 0;

fp = fopen(filename, 'rb');

while ~feof(fp)
	count = count + 1;
    
    type_uint8 = fread(fp,1,'uint8');
	if feof(fp)
		break;
    end
    
    switch type_uint8
        case 0
			type_str = 'half';
            precision = 'uint16=>uint16';
        case 1
			type_str = 'float';
            precision = 'single=>single';
        case 2
			type_str = 'double';
            precision = 'double=>double';
        case 3
			type_str = 'uint8';
            precision = 'uint8=>uint8';
        case 4
			type_str = 'uint16';
            precision = 'uint16=>uint16';
        case 5
			type_str = 'uint32';
            precision = 'uint32=>uint32';
        case 6
			type_str = 'uint64';
            precision = 'uint64=>uint64';
        case 7
			type_str = 'int8';
            precision = 'int8=>int8';
        case 8
			type_str = 'int16';
            precision = 'int16=>int16';
        case 9
			type_str = 'int32';
            precision = 'int32=>int32';
        case 10
			type_str = 'int64';
            precision = 'int64=>int64';
        case 11
			type_str = 'char';
            precision = 'char=>char';
        case 12
			type_str = 'bool';
            precision = 'uint8=>uint8';
        otherwise
            throw(MException('writeTensor:UnsupportedFormat','Unsupported Format'))
    end
    
    size_length = fread(fp,1,'uint32');
    
	lenName=fread(fp,1,'int32');
	if lenName>0
		str=char(fread(fp,lenName,'char*1')');
		disp(str);
	else
		str='';
	end
	nbDims=fread(fp,1,'int32');
	if nbDims==0 % maybe zero paddings at the end of a feature file
		break;
	end
	dim = fread(fp,nbDims,'int32');
	dim = dim(:)';
	
    values = fread(fp,prod(dim),precision);
    
    if strcmp(type_str,'half')
        deltaCount = 1024*8;
        N = numel(values);
        if N>=deltaCount
            values2 = single(zeros(1,N));
            for s=1:deltaCount:N
                e = min(s+deltaCount-1,N);
                values2(s:e) = half2float(values(s:e));
            end
            values = values2;
        else
            values2 = half2float(values);
            values = values2;
        end
    end
    
	if nbDims>1
		values = reshape(values,dim(end:-1:1));
    end
    
    if toPermute
        % matlab is column first, marvin/c++ is row first
        if nbDims>1
            pvec = 1:length(dim);
            pvec([1 2]) = pvec([2 1]);
            values = permute(values, pvec);
            %dim(1:2) = dim(2:1); % actually useless here since we didn't save it
        end
    end

    tensors(count).dim = nbDims;
	tensors(count).name = str;
	tensors(count).value = values;
    
    tensors(count).type = type_str;
    tensors(count).sizeof = size_length;
end

fclose(fp);