# Automatically creating an array of variables and assigning to a function with changing number of outputs

40 views (last 30 days)
Bob Hickish on 31 Jan 2017
Commented: Jan on 31 Jan 2017
I am writing a script that creates an array (A) of vectors. The value of each vector is the set subscripts that describe it's position within the array. eg, for a three dimensional square array with side length 4:
A{1} = [1,1,1]
A{4} = [4,1,1]
A{9} = [1,1,3]
Each vector is then passed to another function which calculates my final result. eg,
results(i)=myfunction(A(i))
Im trying to automate the first stage, ie, assigning the value of the vector A{i} to be its subscript place within A. This will be variable on both the number of dimensions that A has and the side length (the sides are always the same length).
The method I have devised involves using ind2sub(). The number of outputs from in2sub is dependent on the dimensionality of the input matrix. To overcome this I am creating a character array with a variable for each dimension of A. eg for 3 dimensions.
vector_name='[x,y,z]';
and then concatenate it with the string '=ind2sub(size(results),i)' :
command_sting=strcat(vector_name,'ind2sub(size(results),i)')
so for my 3 dimension example command_string would store the character array:
command_string=
'[x,y,z]=ind2sub(size(results),i)'
I am then trying to use eval() to evaluate this statement but I get an error message:
eval(command_string)
Index exceeds matrix dimensions.
However if I type what is stored in command_string straight into the command line I do get the right result:
i=1
[x,y,z]=ind2sub(size(results),i)
x =
1
y =
1
etc.
Why is the eval(command _string) not working? If anyone has a more elegant solution than this use of eval() I'd be grateful to hear it.
Jan on 31 Jan 2017

Guillaume on 31 Jan 2017
Edited: Guillaume on 31 Jan 2017
You don't need to use eval to cope with varying number of outputs. Use cell arrays and their implicit conversion to comma-separated lists:
indices = cell(1, ndims(results)); %create a cell array the right size
[indices{:}] = ind2sub(size(results), someindex); %assign c-s-l output to cell array
indexvector = [indices{:}]; %convert cell array to vector.
Jan on 31 Jan 2017

[x, y, z] = ind2sub( [3,4], 9 );
works even though the size of the input is 2d, you just get z = 1. Likewise if you use n outputs you will just get 1 for those beyond the dimensionality of the input.
I would prefer this as an implementation personally, using the maximum dimensionality you will have. Possibly it may be better putting the results directly into an array rather than n named variables, but wither works.
Your code that comes after your eval would still have the problem of having to know what variables it needs to put into the A cell array so you might as well have all the variables there and ignore the ones not relevant for the given dimensionality.
##### 2 CommentsShowHide 1 older comment
Yes, I would agree. I've never tended to use comma-separated lists for these kind of things so I am always unfamiliar with where they can be used for assignments.