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 件のコメント

John
John 2015 年 12 月 9 日
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)]

サインインしてコメントする。

 採用された回答

Azzi Abdelmalek
Azzi Abdelmalek 2012 年 8 月 28 日
編集済み: Azzi Abdelmalek 2012 年 8 月 28 日

17 投票

n=3 ; x=(1:3)' % example
r=repmat(x,1,n)';
r=r(:)'

3 件のコメント

Jan
Jan 2012 年 8 月 29 日
編集済み: Jan 2012 年 8 月 29 日
This is more efficient than KRON. Small improvement: r = repmat(x, n, 1); without tranposing.
Azzi Abdelmalek
Azzi Abdelmalek 2012 年 8 月 29 日
%you mean
r = repmat(x', n, 1)
Jan
Jan 2012 年 8 月 29 日
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...

サインインしてコメントする。

その他の回答 (6 件)

jack
jack 2015 年 11 月 23 日

19 投票

I would use
repelem(X,3,1)

3 件のコメント

Yuzhen Lu
Yuzhen Lu 2021 年 2 月 18 日
Very neat answer!
Arif Billah
Arif Billah 2023 年 8 月 1 日
This should be chosen as the best 'correct' answer, thanks!
DGM
DGM 2023 年 8 月 2 日
編集済み: DGM 2023 年 8 月 2 日
This is probably the more accepted answer today (hence the upvotes), but repelem() was not available until after the question was originally answered (R2015a).

サインインしてコメントする。

Walter Roberson
Walter Roberson 2012 年 8 月 28 日

4 投票

kron(x, ones(n,1))

4 件のコメント

Vinay Chakravarthi
Vinay Chakravarthi 2015 年 1 月 20 日
Thx man.......
Phat Nguyen
Phat Nguyen 2017 年 4 月 7 日
Very nice man
Abdelrahman Abdeltawab
Abdelrahman Abdeltawab 2018 年 12 月 13 日
編集済み: Abdelrahman Abdeltawab 2018 年 12 月 13 日
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 2018 年 12 月 14 日
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
Kevin Moerman 2012 年 8 月 29 日

2 投票

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 件のコメント

Vinay Chakravarthi
Vinay Chakravarthi 2015 年 1 月 20 日
Thx Man..
Walter Roberson
Walter Roberson 2021 年 9 月 13 日
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

サインインしてコメントする。

Justin Solomon
Justin Solomon 2012 年 8 月 28 日

0 投票

Thanks guys, these all work perfectly!
Jianshe Feng
Jianshe Feng 2016 年 10 月 3 日

0 投票

y = repmat(x,1,3); y = transpose(y); y = y(:);
Jianshe Feng
Jianshe Feng 2016 年 10 月 3 日

0 投票

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

1 件のコメント

Walter Roberson
Walter Roberson 2017 年 4 月 7 日
Ah, but how do you construct the ind vector for general length n repetitions ?

サインインしてコメントする。

カテゴリ

タグ

質問済み:

2012 年 8 月 28 日

編集済み:

DGM
2023 年 8 月 2 日

Community Treasure Hunt

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

Start Hunting!

Translated by