MATLAB Answers

Expanding a Matrix with Repmat/Reshape?

조회 수: 13(최근 30일)
Cou
Cou 2017년 8월 18일
답변: Jan 2017년 8월 18일
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
James Tursa 2017년 8월 18일
편집: James Tursa 2017년 8월 18일
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.

추가 답변(3개)

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

Jan
Jan 2017년 8월 18일
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);

Community Treasure Hunt

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

Start Hunting!

Translated by