I need to repeat numbers in an array with a certain number of repetitions for each value without(repelem or repmat)

3 views (last 30 days)
list_1=[2;3;5;6] is array 1 or [1,4,5,6]
list_2=[1;4;3;1] Number of repetitions for each value in list_1 or [1,4,3,1]
I need the following output
[2;3;3;3;3;5;5;5;6]
or [2,3,3,3,3,5,5,5,6]
for example only one repetition from value 2 becaus of this first value in list_2 it says only one number from the first value in list_1
4 repetitions from number 3
3 repetitions from number 5
1 repetitions from number 6
i need the solution for huge list

Accepted Answer

Akira Agata
Akira Agata on 1 Aug 2022
I'm not sure why you do not prefer repelem/repmat...
Anyway, how about the following solution?
% Example
list_1 = [2;3;5;6];
list_2 = [1;4;3;1];
% One possible solution without using repelem/repmat
C = arrayfun(@(x,y) x*ones(y, 1), list_1, list_2, 'UniformOutput', false);
list_3 = cell2mat(C);
% Show the result
disp(list_3)
2 3 3 3 3 5 5 5 6
  2 Comments
Stephen23
Stephen23 on 2 Aug 2022
Edited: Stephen23 on 2 Aug 2022
"for me it doesn't matter if i use repelem/repmat"
Your question title states "without(repelem or repmat)". If it does not matter, why tell us not to use them?
"if i used repelem or repmat i have the problem that i can't have the solution as array or vector."
REPELEM gives exactly the same output as Akira Agata's answer:
list_1 = [2;3;5;6];
list_2 = [1;4;3;1];
list_3 = repelem(list_1,list_2)
list_3 = 9×1
2 3 3 3 3 5 5 5 6

Sign in to comment.

More Answers (2)

Bruno Luong
Bruno Luong on 2 Aug 2022
Edited: Bruno Luong on 2 Aug 2022
Why prefer a simple method when one can do in a complicated manner:
list_1 = [2;3;5;6]
list_1 = 4×1
2 3 5 6
list_2 = [1;4;3;1]
list_2 = 4×1
1 4 3 1
idx=cumsum(accumarray(cumsum([1; list_2(:)]),1));
list_1(idx(1:end-1))
ans = 9×1
2 3 3 3 3 5 5 5 6

Bruno Luong
Bruno Luong on 2 Aug 2022
Edited: Bruno Luong on 2 Aug 2022
The old for-loop
list_1 = [2;3;5;6];
list_2 = [1;4;3;1];
r = zeros(sum(list_2),1);
start = 0;
for k = 1:length(list_2)
n = list_2(k);
r(start+1:start+n)) = list_1(k);
start = start + n;
end
r
r = 9×1
2 3 3 3 3 5 5 5 6
  2 Comments

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!