www.gusucode.com > matlab 案例源码 matlab代码程序 > matlab/ReadMappedFileExample.m

    %% Read from Mapped File
% This example shows how to create two different memory maps, and then
% read from each of the maps using the appropriate syntax. Then, it shows how
% to modify map properties and analyze your data.
%
% You can read the contents of a file that you mapped to memory using the
% same MATLAB(R) commands you use to read variables from the MATLAB
% workspace. By accessing the |Data| property of the memory map, the contents
% of the mapped file appear as an array in the currently active workspace.
% To read the data you want from the file, simply index into the array. For
% better performance, copy the |Data| field to a variable, and then read the
% mapped file using this variable:
% 
%  dataRef = m.Data; 
%  for k = 1 : N 
%     y(k) = dataRef(k);
%  end 
%  
% By contrast, reading directly from the |memmapfile| object is slower:
%
%  for k = 1 : N 
%     y(k) = m.Data(k);
%  end 

% Copyright 2015 The MathWorks, Inc.



%% Read from Memory Map as Numeric Array

%%
% First, create a sample data file named |records.dat| that contains a 5000-by-1
% matrix of double-precision floating-point numbers.

randData = gallery('uniformdata',[5000,1],0);

fileID = fopen('records.dat','w');
fwrite(fileID,randData,'double'); 
fclose(fileID);
%%
% Map 100 double-precision
% floating-point numbers from the file to memory, and then read a portion of the mapped data.
% Create the memory map, |m|. Specify an |Offset| value of 1024 to begin
% the map 1024 bytes from the start of the file. Specify a |Repeat| value
% of 100 to map 100 values.
m = memmapfile('records.dat','Format','double', ...
      'Offset',1024,'Repeat',100);
%%
% Copy the |Data| property to a variable, |d|. Then, show the format of |d|.
d = m.Data;

whos d
%%
% The mapped data is an 800-byte array because there are 100
% |double| values, each requiring 8 bytes.
%%
% Read a selected set of numbers from the file by indexing into the vector, |d|.
d(15:20)

  %% Read from Memory Map as Nonscalar Structure
  % Map portions of data in the file, |records.dat|, as a sequence of
  % multiple data types.
  %%
  % Call the |memmapfile| function to create a memory map, |m|. 
  m = memmapfile('records.dat',  ...
      'Format', {              ...
         'uint16' [5 8] 'x';   ...
         'double' [4 5] 'y' });
  %%
  % The |Format| parameter tells |memmapfile| to treat the first 80 bytes of
  % the file as a 5-by-8 matrix of |uint16| values, and the 160 bytes after
  % that as a 4-by-5 matrix of |double| values. This pattern repeats until
  % the end of the file is reached.
  %%
  % Copy the |Data| property to a variable, |d|.
d = m.Data
%%
% |d| is a 166-element structure array with two fields. |d| is a nonscalar
% structure array because the file is mapped as a repeating sequence of
% multiple data types.
%%
% Examine one structure in the array to show the format of each field.
d(3)
%%
% Read the |x| field of that structure from the file.
d(3).x
%%
% MATLAB formats the block of data as a 5-by-8 matrix of |uint16| values, as specified by the |Format| property.
%%
% Read the |y| field of that structure from the file.
d(3).y
%%
% MATLAB formats the block of data as a 4-by-5 matrix of |double| values.
%% Modify Map Properties and Analyze Data
% This part of the example shows how to plot the Fourier transform of data read
% from a file via a memory map. It then modifies several properties of the
% existing map, reads from a different part of the data file, and plots a
% histogram from that data.
%%
% Create a sample file named |double.dat|.
randData = gallery('uniformdata',[5000,1],0);
fileID = fopen('double.dat','w');
fwrite(fileID,randData,'double'); 
fclose(fileID);
%%
% Create a |memmapfile object| of 1,000 elements of type |double|, starting at the 1025th byte.
m = memmapfile('double.dat','Offset',1024,  ...
      'Format','double','Repeat',1000);
  
%%
% Copy the |Data| property to a variable, |k|. Then, get data associated with the map and plot the FFT of the first 100 values of the map.
k = m.Data;
plot(abs(fft(k(1:100))))

%%
% This is the first time that data is referenced and is when the actual mapping of the file to the MATLAB address space takes place.

%%
% Change the map properties, but continue using the same file. Whenever you change the value of a memory map property, MATLAB remaps the file to memory.
m.Offset = 4096;
m.Format = 'single';
m.Repeat = 800;

%%
% |m| is now a |memmapfile| object of 800 elements of type |single|. The map
% now begins at the 4096th byte in the file, |records.dat|.
%%
% Read from the portion of the file that begins at the 4096th byte, and calculate the maximum value of the data. This command maps a new region and unmaps the previous region.
X = max(m.Data)