Extend a vector by extending its elements

I have a vector of dimension d: (1,2,...,d) (it's (x_1,x_2,...,x_n) but I removed the 'x_' for simplicity). Now I would like to extend it (in a fast manner) to obtain a d*d vector of the form:
(1,1,...,1,2,...,2,...,d,d,...,d)
where each element repeat d times.
I looked at this page: http://www.mathworks.fr/fr/help/wavelet/ref/wextend.html but it seems to me that the function does not handle this kind of extension.
Thank you for your help.

 Respuesta aceptada

Udit Gupta
Udit Gupta el 29 de Mayo de 2014
Editada: Udit Gupta el 29 de Mayo de 2014
If your vector is X.
reshape(repmat(X,d,1),1,[])
should do the trick.
Example -
>> X = [1 2 3 4];
>> d=4;
>> reshape(repmat(X,d,1),1,[])
ans =
1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4

3 comentarios

f10w
f10w el 29 de Mayo de 2014
Thanks, Udit. If X is a column vector, then is there a way to avoid transposing and then re-transposing again the final vector?
Udit Gupta
Udit Gupta el 29 de Mayo de 2014
reshape(repmat(X,d,1),[],1) will give you a column vector. But in this case you will have to transpose the original vector. SO you will apply -
reshape(repmat(X',d,1),[],1)
f10w
f10w el 29 de Mayo de 2014
Thanks, Udit!

Iniciar sesión para comentar.

Más respuestas (3)

George Papazafeiropoulos
George Papazafeiropoulos el 29 de Mayo de 2014
Editada: George Papazafeiropoulos el 29 de Mayo de 2014
If X is a column vector:
% initial data
d=10;
% engine
X=(1:d)';
ind=ones(d^2,1);
ind(d+1:d:d^2)=1-d;
% result
output_vector=X(cumsum(ind))
If X is a row vector:
% initial data
d=10;
% engine
X=1:d;
ind=ones(d^2,1);
ind(d+1:d:d^2)=1-d;
% result
output_vector=X(cumsum(ind))
without the need to reshape or repmat!

1 comentario

f10w
f10w el 29 de Mayo de 2014
Thanks, George. I will compare with Udit's solution and get back to you.

Iniciar sesión para comentar.

Jos (10584)
Jos (10584) el 29 de Mayo de 2014
Editada: Jos (10584) el 29 de Mayo de 2014
A slower but nice alternative to repmat:
X = [10 20 30 40]
d = 4
Y = kron(X, ones(1,d))
Jos (10584)
Jos (10584) el 29 de Mayo de 2014
Editada: Jos (10584) el 29 de Mayo de 2014
A fast and also nice alternative:
X = [10 ; 20 ; 30 ; 40]
d = 3
Y = X(ceil((1:d*numel(X))/d))

1 comentario

f10w
f10w el 29 de Mayo de 2014
Thanks, Jos. I will compare with Udit's solution and get back to you.

Iniciar sesión para comentar.

Categorías

Más información sobre Creating and Concatenating Matrices en Centro de ayuda y File Exchange.

Etiquetas

Preguntada:

el 29 de Mayo de 2014

Comentada:

el 29 de Mayo de 2014

Community Treasure Hunt

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

Start Hunting!

Translated by