Repeating the rows of an array by a number given by another array

Consider the array:
x=[linspace(1,4,4)' linspace(5,20,4)']
x = 4×2
1 5 2 10 3 15 4 20
I would like to repeat each row by a number given by another array such as
I=[2 3 2 1]'
I = 4×1
2 3 2 1
so that at the end the first row of x is repeat twice, the second row is repeated 3 times and so on.
Is this possible without using a loop?

 채택된 답변

Jan
Jan 2022년 2월 19일
편집: Jan 2022년 2월 19일
Use repelem, which is the built-in efficient solution for repeating elements:
x = [linspace(1,4,4)' linspace(5,20,4)']
x = 4×2
1 5 2 10 3 15 4 20
I = [2 3 2 1];
y = repelem(x, I, 1)
y = 8×2
1 5 1 5 2 10 2 10 2 10 3 15 3 15 4 20
A speed comparison:
x = rand(1e4, 2);
I = repmat(1:10, 1, 1000);
tic
for k = 1:100
C = cell(length(I),1) ;
for i = 1:length(C)
C{i} = repmat(x(i,:),I(i),1) ;
end
C = cell2mat(C);
end
toc
tic
for k = 1:100 % Slightly modified for I is a row vector:
idx = arrayfun(@(x,y)x*ones(1,y),1:numel(I),I,'UniformOutput',false);
C = x([idx{:}],:);
end
toc
tic
for k = 1:100
C = repelem(x, I, 1);
end
toc
% R2018b:
% Elapsed time is 3.676185 seconds. loop
% Elapsed time is 6.848004 seconds. arrayfun
% Elapsed time is 0.038391 seconds. repelem

추가 답변 (1개)

x=[linspace(1,4,4)' linspace(5,20,4)'] ;
I=[2 3 2 1]' ;
C = cell(length(I),1) ;
for i = 1:length(C)
C{i} = repmat(x(i,:),I(i),1) ;
end
C = cell2mat(C)
C = 8×2
1 5 1 5 2 10 2 10 2 10 3 15 3 15 4 20

댓글 수: 4

That's got a loop though
Yepp!
I am not completely opposed to loops if I cannot avoid them, but one beauty of MATLAB is how you both save time (dealing with very large datasets) and space when you avoid loops!
OK good! There has been a lot of work done by MathWorks in recent years on improving the efficiency of loops. You do not need to be afraid of them any more. In many cases, they are on par with vectorised methods.
If the algorithm can be expressed naturally as a loop, do so. Only worry about other methods if the performance is problematic.
Thanks, Mike!

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Creating and Concatenating Matrices에 대해 자세히 알아보기

제품

릴리스

R2021b

질문:

2022년 2월 17일

댓글:

2022년 2월 19일

Community Treasure Hunt

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

Start Hunting!

Translated by