MATLAB Answers

Repeat element of a vector n times without loop.

701 views (last 30 days)
Justin Solomon
Justin Solomon on 28 Aug 2012
Commented: Walter Roberson on 13 Sep 2021 at 4:18
Say I have a column vector x=[a;b;c]. I want to repeat each element n times to make a long length(x)*n vector. For example, for n=3, the answer would be:
ans=
a
a
a
b
b
b
c
c
c
Can anyone think of an elegant way to do this without looping?
Thanks,
Justin
  1 Comment
John
John on 9 Dec 2015
U can use repmat it not exactly elegant but it will do the job
x=[a;b;c]; n=3;
newx = [repmat(x(1),n,1);repmat(x(2),n,1);repmat(x(3),n,1)]

Sign in to comment.

Accepted Answer

Azzi Abdelmalek
Azzi Abdelmalek on 28 Aug 2012
Edited: Azzi Abdelmalek on 28 Aug 2012
n=3 ; x=(1:3)' % example
r=repmat(x,1,n)';
r=r(:)'
  3 Comments
Jan
Jan on 29 Aug 2012
I guess, you are right. repmat(1:3, 1, 2) = [1,2,3,1,2,3] but the OP wants [1,1,2,2,3,3]. Then r = repmat(1:3, 2, 1); r = r(:) avoid the expensive transposition of the matrix. Well, I admit that even reading this message will waste more time then millions of matrix transpositions will cost...

Sign in to comment.

More Answers (6)


Walter Roberson
Walter Roberson on 28 Aug 2012
kron(x, ones(n,1))
  4 Comments
Walter Roberson
Walter Roberson on 14 Dec 2018
The * matrix multiplication operator cannot by itself repeat elements. You would need something like
(x.' * repmat(eye(length(x)), 1, n)).'
if you wanted to use the * operator to duplicate elements -- forcing you to call upon repmat() to duplicate elements.
Using the kronecker is a known idiom for duplicating data. It can be used for non-vectors too.
>> kron([1 2;3 4], ones(3,1))
ans =
1 2
1 2
1 2
3 4
3 4
3 4

Sign in to comment.


Kevin Moerman
Kevin Moerman on 29 Aug 2012
There is several others ways of doing it which in some cases are more efficient. Have a look at what the size of your vector is and compare the methods. Below I compare speeds and it appears that on my computer the third and fourth methods are mostly faster for large arrays.
n=100000; x=1:3;
a=zeros(n,numel(x)); b=a; c=a; d=a; %memory allocation
tic; a=repmat(x, n, 1); t1=toc; %Repmat method
tic; b=kron(x, ones(n,1)); t2=toc; %kron method
tic; c=x(ones(1,n),:); t3=toc; %indexing method
tic; d=ones(n,1)*x; t4=toc; %multiplication method
Kevin
  2 Comments
Walter Roberson
Walter Roberson on 13 Sep 2021 at 4:18
format long g
n=100000; x=1:3;
a=zeros(n,numel(x)); b=a; c=a; d=a; %memory allocation
tic; a=repmat(x, n, 1); t1=toc %Repmat method
t1 =
0.000543
tic; b=kron(x, ones(n,1)); t2=toc %kron method
t2 =
0.006106
tic; c=x(ones(1,n),:); t3=toc %indexing method
t3 =
0.002276
tic; d=ones(n,1)*x; t4=toc %multiplication method
t4 =
0.001798

Sign in to comment.



Jianshe Feng
Jianshe Feng on 3 Oct 2016
y = repmat(x,1,3); y = transpose(y); y = y(:);

Jianshe Feng
Jianshe Feng on 3 Oct 2016
ind = [1;1;1;2;2;2;3;3;3]; x(ind)
  1 Comment
Walter Roberson
Walter Roberson on 7 Apr 2017
Ah, but how do you construct the ind vector for general length n repetitions ?

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!

Translated by