12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- % NPY-MATLAB constructNPYheader function. Copied from https://github.com/kwikteam/npy-matlab
- function header = constructNPYheader(dataType, shape, varargin)
- if ~isempty(varargin)
- fortranOrder = varargin{1}; % must be true/false
- littleEndian = varargin{2}; % must be true/false
- else
- fortranOrder = true;
- littleEndian = true;
- end
- dtypesMatlab = {'uint8','uint16','uint32','uint64','int8','int16','int32','int64','single','double', 'logical'};
- dtypesNPY = {'u1', 'u2', 'u4', 'u8', 'i1', 'i2', 'i4', 'i8', 'f4', 'f8', 'b1'};
- magicString = uint8([147 78 85 77 80 89]); %x93NUMPY
- majorVersion = uint8(1);
- minorVersion = uint8(0);
- % build the dict specifying data type, array order, endianness, and
- % shape
- dictString = '{''descr'': ''';
- if littleEndian
- dictString = [dictString '<'];
- else
- dictString = [dictString '>'];
- end
- dictString = [dictString dtypesNPY{strcmp(dtypesMatlab,dataType)} ''', '];
- dictString = [dictString '''fortran_order'': '];
- if fortranOrder
- dictString = [dictString 'True, '];
- else
- dictString = [dictString 'False, '];
- end
- dictString = [dictString '''shape'': ('];
- % if length(shape)==1 && shape==1
- %
- % else
- % for s = 1:length(shape)
- % if s==length(shape) && shape(s)==1
- %
- % else
- % dictString = [dictString num2str(shape(s))];
- % if length(shape)>1 && s+1==length(shape) && shape(s+1)==1
- % dictString = [dictString ','];
- % elseif length(shape)>1 && s<length(shape)
- % dictString = [dictString ', '];
- % end
- % end
- % end
- % if length(shape)==1
- % dictString = [dictString ','];
- % end
- % end
- for s = 1:length(shape)
- dictString = [dictString num2str(shape(s))];
- if s<length(shape)
- dictString = [dictString ', '];
- end
- end
- dictString = [dictString '), '];
- dictString = [dictString '}'];
- totalHeaderLength = length(dictString)+10; % 10 is length of magicString, version, and headerLength
- headerLengthPadded = ceil(double(totalHeaderLength+1)/16)*16; % the whole thing should be a multiple of 16
- % I add 1 to the length in order to allow for the newline character
- % format specification is that headerlen is little endian. I believe it comes out so using this command...
- headerLength = typecast(int16(headerLengthPadded-10), 'uint8');
- zeroPad = zeros(1,headerLengthPadded-totalHeaderLength, 'uint8')+uint8(32); % +32 so they are spaces
- zeroPad(end) = uint8(10); % newline character
- header = uint8([magicString majorVersion minorVersion headerLength dictString zeroPad]);
- end
|