Repeat element of a vector n times without loop.

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 comentario

John
John el 9 de Dic. de 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)]

Iniciar sesión para comentar.

 Respuesta aceptada

Azzi Abdelmalek
Azzi Abdelmalek el 28 de Ag. de 2012
Editada: Azzi Abdelmalek el 28 de Ag. de 2012
n=3 ; x=(1:3)' % example
r=repmat(x,1,n)';
r=r(:)'

3 comentarios

Jan
Jan el 29 de Ag. de 2012
Editada: Jan el 29 de Ag. de 2012
This is more efficient than KRON. Small improvement: r = repmat(x, n, 1); without tranposing.
%you mean
r = repmat(x', n, 1)
Jan
Jan el 29 de Ag. de 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...

Iniciar sesión para comentar.

Más respuestas (6)

jack
jack el 23 de Nov. de 2015

19 votos

I would use
repelem(X,3,1)

3 comentarios

Yuzhen Lu
Yuzhen Lu el 18 de Feb. de 2021
Very neat answer!
Arif Billah
Arif Billah el 1 de Ag. de 2023
This should be chosen as the best 'correct' answer, thanks!
DGM
DGM el 2 de Ag. de 2023
Editada: DGM el 2 de Ag. de 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).

Iniciar sesión para comentar.

Walter Roberson
Walter Roberson el 28 de Ag. de 2012
kron(x, ones(n,1))

4 comentarios

Thx man.......
Phat Nguyen
Phat Nguyen el 7 de Abr. de 2017
Very nice man
Abdelrahman Abdeltawab
Abdelrahman Abdeltawab el 13 de Dic. de 2018
Editada: Abdelrahman Abdeltawab el 13 de Dic. de 2018
Dear Walter Roberson,
why you did not use outer product and you chosen kronecker ( just curious ) because the guy's question was having vectors ?
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

Iniciar sesión para comentar.

Kevin Moerman
Kevin Moerman el 29 de Ag. de 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 comentarios

Thx Man..
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

Iniciar sesión para comentar.

Jianshe Feng
Jianshe Feng el 3 de Oct. de 2016

0 votos

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

0 votos

ind = [1;1;1;2;2;2;3;3;3]; x(ind)

1 comentario

Walter Roberson
Walter Roberson el 7 de Abr. de 2017
Ah, but how do you construct the ind vector for general length n repetitions ?

Iniciar sesión para comentar.

Categorías

Etiquetas

Preguntada:

el 28 de Ag. de 2012

Editada:

DGM
el 2 de Ag. de 2023

Community Treasure Hunt

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

Start Hunting!

Translated by