Repeat element of a vector n times without loop.
Afficher commentaires plus anciens
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 commentaire
John
le 9 Déc 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)]
Réponse acceptée
Plus de réponses (6)
jack
le 23 Nov 2015
19 votes
I would use
repelem(X,3,1)
3 commentaires
Yuzhen Lu
le 18 Fév 2021
Very neat answer!
Arif Billah
le 1 Août 2023
This should be chosen as the best 'correct' answer, thanks!
Walter Roberson
le 28 Août 2012
kron(x, ones(n,1))
4 commentaires
Vinay Chakravarthi
le 20 Jan 2015
Thx man.......
Phat Nguyen
le 7 Avr 2017
Very nice man
Abdelrahman Abdeltawab
le 13 Déc 2018
Modifié(e) : Abdelrahman Abdeltawab
le 13 Déc 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 ?
Walter Roberson
le 14 Déc 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
Kevin Moerman
le 29 Août 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 commentaires
Vinay Chakravarthi
le 20 Jan 2015
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
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
Justin Solomon
le 28 Août 2012
0 votes
Jianshe Feng
le 3 Oct 2016
0 votes
y = repmat(x,1,3); y = transpose(y); y = y(:);
Jianshe Feng
le 3 Oct 2016
0 votes
ind = [1;1;1;2;2;2;3;3;3]; x(ind)
1 commentaire
Walter Roberson
le 7 Avr 2017
Ah, but how do you construct the ind vector for general length n repetitions ?
Catégories
En savoir plus sur Logical dans Centre d'aide et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!