# Repeat element of a vector n times without loop.

175 visualizzazioni (ultimi 30 giorni)
Justin Solomon il 28 Ago 2012
Modificato: DGM il 2 Ago 2023
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 CommentoMostra NessunoNascondi Nessuno
John il 9 Dic 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)]

Accedi per commentare.

### Risposta accettata

Azzi Abdelmalek il 28 Ago 2012
Modificato: Azzi Abdelmalek il 28 Ago 2012
n=3 ; x=(1:3)' % example
r=repmat(x,1,n)';
r=r(:)'
##### 3 CommentiMostra 2 commenti meno recentiNascondi 2 commenti meno recenti
Jan il 29 Ago 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...

Accedi per commentare.

### Più risposte (6)

jack il 23 Nov 2015
I would use
repelem(X,3,1)
##### 3 CommentiMostra 2 commenti meno recentiNascondi 2 commenti meno recenti
DGM il 2 Ago 2023
Modificato: DGM il 2 Ago 2023
This is probably the more accepted answer today (hence the upvotes), but repelem() was not available until after the question was originally answered (R2015a).

Accedi per commentare.

Walter Roberson il 28 Ago 2012
kron(x, ones(n,1))
##### 4 CommentiMostra 3 commenti meno recentiNascondi 3 commenti meno recenti
Walter Roberson il 14 Dic 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

Accedi per commentare.

Kevin Moerman il 29 Ago 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 CommentiMostra 1 commento meno recenteNascondi 1 commento meno recente
Walter Roberson il 13 Set 2021
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

Accedi per commentare.

Justin Solomon il 28 Ago 2012
Thanks guys, these all work perfectly!
##### 0 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Jianshe Feng il 3 Ott 2016
y = repmat(x,1,3); y = transpose(y); y = y(:);
##### 0 CommentiMostra -1 commenti meno recentiNascondi -1 commenti meno recenti

Accedi per commentare.

Jianshe Feng il 3 Ott 2016
ind = [1;1;1;2;2;2;3;3;3]; x(ind)
##### 1 CommentoMostra NessunoNascondi Nessuno
Walter Roberson il 7 Apr 2017
Ah, but how do you construct the ind vector for general length n repetitions ?

Accedi per commentare.

### Categorie

Scopri di più su Matrix Indexing in Help Center e File Exchange

### Community Treasure Hunt

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

Start Hunting!