I need to repeat numbers in an array with a certain number of repetitions for each value without(repelem or repmat)
5 次查看(过去 30 天)
显示 更早的评论
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
0 个评论
采纳的回答
Akira Agata
2022-8-1
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 个评论
Stephen23
2022-8-2
编辑:Stephen23
2022-8-2
"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)
更多回答(2 个)
Bruno Luong
2022-8-2
编辑:Bruno Luong
2022-8-2
Why prefer a simple method when one can do in a complicated manner:
list_1 = [2;3;5;6]
list_2 = [1;4;3;1]
idx=cumsum(accumarray(cumsum([1; list_2(:)]),1));
list_1(idx(1:end-1))
Bruno Luong
2022-8-2
编辑:Bruno Luong
2022-8-2
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
2 个评论
Bruno Luong
2022-8-2
Some timing, for-loop seems to be the fatest
list_1 = randi(1000,1000,1);
list_2 = randi(2000,1000,1);
tic
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
toc
tic
C = arrayfun(@(x,y) x*ones(y, 1), list_1, list_2, 'UniformOutput', false);
list_3 = cell2mat(C);
toc
tic
idx=cumsum(accumarray(cumsum([1; list_2(:)]),1));
r=list_1(idx(1:end-1));
toc
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Matrices and Arrays 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!