Repeat element of a vector n times without loop.

106 vues (au cours des 30 derniers jours)
Justin Solomon
Justin Solomon le 28 Août 2012
Modifié(e) : DGM le 2 Août 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 commentaire
John
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)]

Connectez-vous pour commenter.

Réponse acceptée

Azzi Abdelmalek
Azzi Abdelmalek le 28 Août 2012
Modifié(e) : Azzi Abdelmalek le 28 Août 2012
n=3 ; x=(1:3)' % example
r=repmat(x,1,n)';
r=r(:)'
  3 commentaires
Azzi Abdelmalek
Azzi Abdelmalek le 29 Août 2012
%you mean
r = repmat(x', n, 1)
Jan
Jan le 29 Août 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...

Connectez-vous pour commenter.

Plus de réponses (6)

jack
jack le 23 Nov 2015
I would use
repelem(X,3,1)
  3 commentaires
Arif Billah
Arif Billah le 1 Août 2023
This should be chosen as the best 'correct' answer, thanks!
DGM
DGM le 2 Août 2023
Modifié(e) : DGM le 2 Août 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).

Connectez-vous pour commenter.


Walter Roberson
Walter Roberson le 28 Août 2012
kron(x, ones(n,1))
  4 commentaires
Abdelrahman Abdeltawab
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
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

Connectez-vous pour commenter.


Kevin Moerman
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
Vinay Chakravarthi le 20 Jan 2015
Thx Man..
Walter Roberson
Walter Roberson le 13 Sep 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

Connectez-vous pour commenter.


Justin Solomon
Justin Solomon le 28 Août 2012
Thanks guys, these all work perfectly!

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

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

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by