File Exchange Pick of the Week

Our best user submissions

For Each

Sean's pick this week is For-Each by Jeremy Hughes.

My pick this week is a toolbox from our development organization for a for-each loop construct in MATLAB. A for-each loop allows you to iterate over a set or dimension without having to worry about indexing.

MATLAB actually already has this built in for single elements of numeric arrays:

% Display each element in x
for thisfile = [1 pi 8 -3]
    disp(thisfile)
end
     1
    3.1416
     8
    -3

This could've course been written with an index like below.

% Display each element in x with an index
thisfile = [1 pi 8 -3];
for ii = 1:numel(thisfile)
    disp(thisfile(ii))
end
     1
    3.1416
     8
    -3

But what if we want to traverse every column or slice of a three dimensional array? Or each element in a cell array? Or each combination of two arrays? This is where Jeremy's for-each construct comes in handy since you won't need to worry about indexing.

Let's take a bunch of csv files and make copies of them with just the rows of data we care about. These files contain energy outage information for energy outages in America. Being from New England, I just want the records that correspond to the North East.

% Scrape the data directory for all csv files
datadir = '.\Data\';
files = dir([datadir '*.csv']);
filenames = {files.name};
disp(filenames)
  Columns 1 through 4
    '2002Data.csv'    '2003Data.csv'    '2004Data.csv'    '2005Data.csv'
  Columns 5 through 8
    '2006Data.csv'    '2007Data.csv'    '2008Data.csv'    '2009Data.csv'
  Columns 9 through 12
    '2010Data.csv'    '2011Data.csv'    '2012Data.csv'    '2013Data.csv'
%  Make a directory for output
outputdir = 'NorthEastData';
mkdir(outputdir)

% Loop over each filename, read, extract, write
for thisfile = each(filenames)
    % Reach each file
    Temp = readtable([datadir thisfile]);
    Temp.Region = categorical(Temp.Region); % Convert to categorical

    % Identify and extract the northeast records
    northeast = Temp.Region == 'NorthEast';
    Output = Temp(northeast,:);


    % Make new full file name
    [~,name,ext] = fileparts(thisfile);
    outputfile = fullfile(pwd,outputdir,[name '_NorthEast' ext]);

    % Write out
    writetable(Output,outputfile)
end

Now we can check to make sure it did what we expect.

Personally, I see this being really useful for working with sets of files or images, like I have done above, or for needle in the haystack type problems where I want to find something in a bunch of combinations and stop as soon as I do.

Advanced Programming Challenge!

And now for a challenge:

I used the informal interface to this toolbox, i.e. the each function, to traverse each file. There is also a formal interface that provides the ability to define your own iterators so that you can traverse objects of your own class or anything else. I will give some MathWorks goodies to anyone who will write their own eachFile iterator that I could use above to recreate what I have.

Please post it below.

Comments

The development team is actively looking for feedback on this, so please leave them a comment with any thoughts you have.

Give it a try and let us know what you think here.




Published with MATLAB® R2014b

|
  • print

Comments

To leave a comment, please click here to sign in to your MathWorks Account or create a new one.