# How can I automatically scale each of the elements of a Vector V to the respective size of the cell of the struct S?

1 view (last 30 days)
ga56 on 12 Jan 2017
Edited: Stephen23 on 18 Jan 2017
I have a struct called Observations.t0 which has 140 cells -> Observations(1).t0 up to Observations(140).to and every Observation has a different amount of elements.
I want to create a Vector with ones with the length of the cell for every cell and multiply it with a value from another struct. I tried it this way:
Ratings=vertcat(ones(length(Observations(:).t0),1)*values.b(:,4));
If Observations(1).t0 had 5 elements in its cell, I want to create a vector that looks like this (1;1;1;1;1) and afterwards multiply the entire vector with the value of values.b(1,4)) which could be 3. The result would be the vector (3;3;3;3;3). Afterwards I want to do that process again with the second cell and extend my vector with the results. That could look like this: (3;3;3;3;4;4).
I get an error with the length(Observations(:).t0),1) it says to many input arguments. Can I solve that with a for loop?

Wilson A N on 18 Jan 2017
You can use for loop to do this as shown in the code below:
clear;
clc;
structSize = 20;
observations(structSize).t0 = [];
for i = 1:structSize
observations(i).t0 = ones(1,i);
end
values.b = rand(20,20);
Ratings = [];
for i = 1:4
Ratings = [Ratings;ones(length(observations(i).t0),1)*values.b(i,4)];
end
Stephen23 on 18 Jan 2017
Edited: Stephen23 on 18 Jan 2017
Note that expanding the array Ratings on each loop iteration is not efficient and will show an mlint warning: To write efficient code it is important to preallocate the array before the loop:

Stephen23 on 18 Jan 2017
Edited: Stephen23 on 18 Jan 2017
You can use arrayfun to do this quite neatly:
>> vec = [1,9,4,0];
>> obs(1).t0 = 0:4;
>> obs(2).t0 = 5;
>> obs(3).t0 = 6:7;
>> obs(4).t0 = 8:9;
>> C = arrayfun(@(s,n)n*ones(size(s.t0)),obs,vec,'uni',0);
>> out = horzcat(C{:})
out =
1 1 1 1 1 9 4 4 0 0