# Expanding a Matrix with Repmat/Reshape?

19 views (last 30 days)
Cou on 18 Aug 2017
Answered: Jan on 18 Aug 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.

James Tursa on 18 Aug 2017
Edited: James Tursa on 18 Aug 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.

Steven Lord on 18 Aug 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 on 18 Aug 2017
Edited: Matt J on 18 Aug 2017
Here's a truly loop free method,
clear p
p(cumsum(y,'reverse'))=1;
z=x(cumsum(flip(p)))

Jan on 18 Aug 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);