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)
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:
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?

Accepted Answer

Wilson A N
Wilson A N on 18 Jan 2017
You can use for loop to do this as shown in the code below:
structSize = 20;
observations(structSize).t0 = [];
for i = 1:structSize
observations(i).t0 = ones(1,i);
values.b = rand(20,20);
Ratings = [];
for i = 1:4
Ratings = [Ratings;ones(length(observations(i).t0),1)*values.b(i,4)];
  1 Comment
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:

Sign in to comment.

More Answers (1)

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

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by