T. Eskin
T. Eskin

Reputation: 111

How to create array data-structures in MATLAB?

I basically have a large data set file and I want to write a MATLAB script that creates a data structure for it. I have tried to read about using structured arrays in MATLAB, but I haven't found a solution of how to do this. I don't really have a lot of experience in writing scripts on MATLAB.

Edited: My data set is a large list of items with, say, 10 different characteristics of each item written down. So for example, say 100,000 listings of houses and characteristics given could be price, county, state, date when sold, etc. This file is in a txt., xls., or any format you like to play with.

I would like to write a MATLAB script that creates a data structure of it say in the format:

house(i).price    
house(i).county
house(i).state
house(i).date

etc

Any suggestions to the right direction or examples of teaching how to do this would be greatly appreciated.

Upvotes: 1

Views: 243

Answers (1)

macduff
macduff

Reputation: 4685

This seems like a very reasonable question, and one that can be easily addressed.

The format of the file, really makes this problem easy or hard. I really don't like .xls files for this kind of work myself, but I realize, you get what you get. Let's assume it's in a tab delimited text file like:

Price   County  State   Date
100000  Sherlock    London  2001-10-01
134000  Holmes  Dartmoor    2011-12-30
123456  Watson  Boston  2003-04-15

IfI would just read the whole thing into an parse the field name row and use dynamic structure naming to make the array of structures.

fid = fopen('data.txt','r');

tline = fgetl(fid);
flds = regexp(tline,'\s*','split');
% initialize the first prototype struct
data = struct();
for ii=1:length(flds)
  data.(flds{ii}) = [];
end
ii = 1;
% get the first line of data
tline = fgetl(fid);
while ischar(tline)
  % parse the data
  rowData = regexp(tline,'\s*','split');
  % we're assuming no missing data, etc
  % populate the structure
  for jj=1:length(flds)
    data(ii).(flds{jj}) = rowData{jj};
  end
  % since we don't know how many lines we have
  % we could figure that out, but we won't now
  % we'll just use the size extending feature of
  % matlab arrays, even though it's slow, just
  % to show how we would do it
  tline = fgetl(fid);
  ii = ii + 1;
end
fclose(fid)

Hope this gets you started!

Upvotes: 1

Related Questions