Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MATLAB: duplicating vector 'n' times [duplicate]

Tags:

vector

matlab

I have a vector, e.g.

vector = [1 2 3]

I would like to duplicate it within itself n times, i.e. if n = 3, it would end up as:

vector = [1 2 3 1 2 3 1 2 3]

How can I achieve this for any value of n? I know I could do the following:

newvector = vector;
for i = 1 : n-1
    newvector = [newvector vector];
end

This seems a little cumbersome though. Any more efficient methods?

like image 534
CaptainProg Avatar asked Apr 25 '12 12:04

CaptainProg


People also ask

How do you repeat a vector and time in MATLAB?

Description. B = repmat( A , n ) returns an array containing n copies of A in the row and column dimensions. The size of B is size(A)*n when A is a matrix. B = repmat( A , r1,...,rN ) specifies a list of scalars, r1,..,rN , that describes how copies of A are arranged in each dimension.

How do you repeat something in MATLAB?

repeat( action , n ) repeats the same action n times. You can specify the input arguments in any order. That is, repeat(action,n) and repeat(n,action) both repeat the action n times.

What is Repmat?

Repmat in Matlab is one of the commands in Matlab which is used for array manipulations. This command gives output in the form of an array repetition of the original array. Here array is a collection of the number of elements, data, information, etc. An array is represented within square brackets in Matlab.


2 Answers

Try

repmat([1 2 3],1,3)

I'll leave you to check the documentation for repmat.

like image 174
High Performance Mark Avatar answered Oct 07 '22 00:10

High Performance Mark


This is a Faster Method Than repmat or reshape by an Order of Magnitude

One of the best methods for doing such things is Using Tony's Trick. Repmat and Reshape are usually found to be slower than Tony's trick as it directly uses Matlabs inherent indexing. To answer you question,

Lets say, you want to tile the row vector r=[1 2 3] N times like r=[1 2 3 1 2 3 1 2 3...], then,

c=r'
cc=c(:,ones(N,1));
r_tiled = cc(:)';

This method has significant time savings against reshape or repmat for large N's.

EDIT : Reply to @Li-aung Yip's doubts

I conducted a small Matlab test to check the speed differential between repmat and tony's trick. Using the code mentioned below, I calculated the times for constructing the same tiled vector from a base vector A=[1:N]. The results show that YES, Tony's-Trick is FASTER BY AN ORDER of MAGNITUDE, especially for larger N. People are welcome to try it themselves. This much time differential can be critical if such an operation has to be performed in loops. Here is the small script I used;

N= 10 ;% ASLO Try for values N= 10, 100, 1000, 10000

% time for tony_trick
tic;
A=(1:N)';
B=A(:,ones(N,1));
C=B(:)';
t_tony=toc;
clearvars -except t_tony N

% time for repmat
tic;
A=(1:N);
B=repmat(A,1,N);
t_repmat=toc;
clearvars -except t_tony t_repmat N

The Times (in seconds) for both methods are given below;

  • N=10, time_repmat = 8e-5 , time_tony = 3e-5
  • N=100, time_repmat = 2.9e-4 , time_tony = 6e-5
  • N=1000, time_repmat = 0.0302 , time_tony = 0.0058
  • N=10000, time_repmat = 2.9199 , time_tony = 0.5292

My RAM didn't permit me to go beyond N=10000. I am sure, the time difference between the two methods will be even more significant for N=100000. I know, these times might be different for different machines, but the relative difference in order-of-magnitude of times will stand. Also, I know, the avg of times could have been a better metric, but I just wanted to show the order of magnitude difference in time consumption between the two approaches. My machine/os details are given below :

Relevant Machine/OS/Matlab Details : Athlon i686 Arch, Ubuntu 11.04 32 bit, 3gb ram, Matlab 2011b

like image 37
Abhinav Avatar answered Oct 07 '22 00:10

Abhinav