MATLAB Answers

How to generate sequences from two vectors using rowfun

3 views (last 30 days)
Etsuko on 13 Jul 2016
Edited: Stephen on 13 Jul 2016
I am trying to generate sequences for which starting values and last values+1 are contained in vectors, without using for-loop. Because there is a lot of data to process, doing for-loop is unfortunately not feasible. As the output, I want to have all the sequences to be concatenated into one vector. I think rowfun can help me here, but so far I have not been successful. If someone can give me a helping hand, I would be grateful.
This is an example;
x = [1,6,12]'; y = [5,10,13]';
the output I wish to obtain: z = [1,2,3,4,6,7,8,9,12];
I imagine it should be something like;
inputvecs = table(x,y);
z = rowfun(@seqgen,inputvecs)
How should the function seqgen look in this case? Should concatenation within the function?
Thank you very much for your help.

Accepted Answer

Stephen on 13 Jul 2016
Edited: Stephen on 13 Jul 2016
You could use arrayfun instead:
>> x = [1,6,12]; y = [5,10,13];
>> cell2mat(arrayfun(@(a,b)a:b-1, x,y,'UniformOutput',false))
ans =
1 2 3 4 6 7 8 9 12
>> tmp = arrayfun(@(a,b)a:b-1,x,y,'UniformOutput',false);
>> horzcat(tmp{:})
ans =
1 2 3 4 6 7 8 9 12
Note that the inputs must be horizontal vectors.
Stephen on 13 Jul 2016
@Etsuko: note that to get meaningful timing values for such quick functions, it is recommended to repeat the process a few hundred or thousand times.

Sign in to comment.

More Answers (1)

Andrei Bobrov
Andrei Bobrov on 13 Jul 2016
Edited: Andrei Bobrov on 13 Jul 2016
x = [1,6,12]; y = [5,10,13];
a = (min(x):max(y))';
[ii,~] = find(bsxfun(@ge,a,x)&bsxfun(@lt,a,y));
out = a(ii);

Community Treasure Hunt

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

Start Hunting!