# help with dynamic variable names set with 'for' incrementer

4 views (last 30 days)
Scragmore on 27 Nov 2011
Edited: Stephen on 12 Jan 2016
Hi,
I am trying to split up a large numerical dataset into individual days. What I have that works and what I have that failed is;
function [FxStOut, FxStIndex] = FxSt(FxStIn)
%Struct for Forex
UnqDate = unique(FxStIn(:,1));
UnqL = length(UnqDate);
for ii = 1:UnqL
indx = FxStIn(:,1) == UnqDate(ii);
eval(['dataOut.d' num2str(ii) ' = FxStIn(indx, 2:6);']);
%Have tried but died
%dataOut(ii) = FxStIn(indx, 2:6);
%dataOut.d([ii]) = FxStIn(indx, 2:6);
%dataOut.([ii]) = FxStIn(indx, 2:6);
end
FxStOut = dataOut;
FxStIndex = UnqDate;
Is 'eval' the only way to achieve this, both reading in and out of array. A number/numeral can not be a variable/array name, as I would like;
data.1
data.2
data.3
is this correct.
Can I solve this by using a 3D (:,:,:), however, each depth is a different size (factors different) and I presume that is not allowed.
##### 2 CommentsShowHide 1 older comment
Stephen on 12 Jan 2016
All of the answers say "avoid eval". Read this to know why eval is a really bad way of programming (that beginners seem to love):

Teja Muppirala on 27 Nov 2011
You are right in that using EVAL to dynamically generate variable names is generally a messy approach that's not very readable, slow, and doesn't scale well.
One alternative is using cell arrays.
Cell arrays let you store differently sized data, for example:
M{1} = [1 2 3]
M{2} = [1 2; 3 4]
M{3} = 'hello'
M{1} + 10
M{2} * 5
disp(M{3})
David Holdaway on 7 Mar 2012
Cell arrays appear a great way of doing this! Thanks very much!

bym on 27 Nov 2011
eval can be evil! avoid if possible.

Walter Roberson on 27 Nov 2011
eval(['dataOut.d' num2str(ii) ' = FxStIn(indx, 2:6);']);
with
dataOut.(['d' num2str(ii)]) = FxStIn(indx, 2:6);
or alternately with
dataOut.(sprintf('d%d',ii)) = FxStIn(indx, 2:6);
Scragmore on 28 Nov 2011
Walter,
Thanks. Shame you cant accept two ans. Your response answered my question directly but Teja's ans gave me an alternative view and solution to my problem that I am going to run with.
Thanks All