DPG demo version from 2019-08-20
[dpg] / readnd.m
1 function [A,meta] = readnd(fname);
2 %
3 % READND - read a binary N-dimensional data file
4 %
5 % The function reads N-dimensional data saved by either the C or Matlab
6 % form of savend.
7 %
8 %    See Also SAVEND
9 %
10
11 %
12 % Copyright 2004-2008  W. Scott Hoge  (wsh032580 at proton dot me)
13 %
14 % Licensed under the terms of the MIT License 
15 % (https://opensource.org/licenses/MIT)
16
17
18 fid = fopen(fname,'rb');
19 if fid <0, error(['Couldn''t open ' fname]); end;
20
21 fseek(fid,0,'eof');
22 maxfln = ftell(fid);
23 fseek(fid,0,'bof');
24
25 fln = fread(fid,1,'integer*4');
26 hdr = fscanf(fid,'%c',4);          
27 if ~strcmp(hdr,'nddf')
28   warning(['This does not appear to be a .nd file.  The file type field is ' ...
29            'not ''nddf'' ']);
30   return;
31 end;
32  
33 szln = fread(fid,1,'integer*4');    
34   sz = fread(fid,szln,'integer*4');
35  hdr = fscanf(fid,'%c',4);
36
37 if ( strcmp(hdr(4),'c') ),
38   cmplx = 2;
39 else
40   cmplx = 1;
41 end;
42    
43 if strcmp( hdr(1:3), 'dbl' ),
44   data = fread(fid,cmplx*prod(sz),'double');
45 elseif strcmp( hdr(1:3), 'flt' ),
46   data = fread(fid,cmplx*prod(sz),'float');
47 elseif strcmp( hdr(1:3), 'int' ),
48   data = fread(fid,cmplx*prod(sz),'int16');
49 elseif strcmp( hdr(1:3), 'cha' ),
50   data = fread(fid,cmplx*prod(sz),'uint8');
51 end;
52 fprintf('format: %s\n',hdr);
53
54 if ( strcmp(hdr(4),'c') ),
55   data = data(1:2:length(data)) + j * data(2:2:length(data));
56 end;
57 if ( prod(size(data)) ~= prod(sz) ), 
58   fprintf('declared: %10d\n',prod(sz));
59   fprintf('    read: %10d\n',length(data));
60   warning('Error: size of read data doesn''t match declared size');
61 else
62   if length(sz)==1, sz = size(data)'; end;
63   A = reshape( data, sz' );
64 end;
65
66 if ( ftell(fid) ~= maxfln ), 
67
68   metaln = fread(fid,1,'integer*4');
69   hdr = fscanf(fid,'%c',4);  
70   
71   if strcmp( hdr, 'meta' ),
72     meta = fread(fid,metaln,'char');
73   else,
74     warning('Warning: number of bytes read from file is suspicious'); 
75     disp([ ftell(fid) fln ]);
76     keyboard;
77   end;
78 end;
79
80 fclose(fid); 
81