Repeat element of a vector n times without loop.
77 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Justin Solomon
am 28 Aug. 2012
Bearbeitet: DGM
am 2 Aug. 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 Kommentar
John
am 9 Dez. 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)]
Akzeptierte Antwort
Azzi Abdelmalek
am 28 Aug. 2012
Bearbeitet: Azzi Abdelmalek
am 28 Aug. 2012
n=3 ; x=(1:3)' % example
r=repmat(x,1,n)';
r=r(:)'
3 Kommentare
Jan
am 29 Aug. 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...
Weitere Antworten (6)
Walter Roberson
am 28 Aug. 2012
kron(x, ones(n,1))
4 Kommentare
Abdelrahman Abdeltawab
am 13 Dez. 2018
Bearbeitet: Abdelrahman Abdeltawab
am 13 Dez. 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
am 14 Dez. 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
am 29 Aug. 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 Kommentare
Walter Roberson
am 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
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
Jianshe Feng
am 3 Okt. 2016
ind = [1;1;1;2;2;2;3;3;3]; x(ind)
1 Kommentar
Walter Roberson
am 7 Apr. 2017
Ah, but how do you construct the ind vector for general length n repetitions ?
Siehe auch
Kategorien
Mehr zu Logical (Boolean) Operations finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!