Expanding a Matrix with Repmat/Reshape?

8 views (last 30 days)
Cou
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.

Accepted Answer

James Tursa
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.

More Answers (3)

Steven Lord
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
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
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);

Categories

Find more on Sparse Matrices in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!