Expanding a Matrix with Repmat/Reshape?

8 vues (au cours des 30 derniers jours)
Cou
Cou le 18 Août 2017
Réponse apportée : Jan le 18 Août 2017
I have two vectors:
x = [3 6 7 10]
y = [2 2 2 4]
I am trying to create vector
z = [3 3 6 6 7 7 10 10 10 10]
So each element x(i) is repeated y(i) times. This is straight forward with a for loop, but I'm trying to avoid looping, if possible. The size and values of x and y may change as well (they are populated by variables).
Here's the loop version:
z= [];
for i = 1:numel(y)
z= [z, repmat(x(i), 1, y(i))];
end
Any help is appreciated.

Réponse acceptée

James Tursa
James Tursa le 18 Août 2017
Modifié(e) : James Tursa le 18 Août 2017
E.g.,
z = cell2mat(cellfun(@(x,y)repmat(x,1,y),num2cell(x),num2cell(y),'Uni',false));
But this just hides the loops in the background.

Plus de réponses (3)

Steven Lord
Steven Lord le 18 Août 2017
If you're using release R2015a or later, use repelem.
x = [3 6 7 10];
y = [2 2 2 4];
z = repelem(x, y)

Matt J
Matt J le 18 Août 2017
Modifié(e) : Matt J le 18 Août 2017
Here's a truly loop free method,
clear p
p(cumsum(y,'reverse'))=1;
z=x(cumsum(flip(p)))

Jan
Jan le 18 Août 2017
x = [3 6 7 10]
y = [2 2 2 4]
z = repelem(x, y);
Or if this is the bottleneck of your code, try FEX: RunLength:
Z = RunLength(x, y);

Catégories

En savoir plus sur Sparse Matrices dans Help Center et File Exchange

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by