MATLAB: Command and Control vectors

MATLAB

I am having trouble trying to make this work. I want it so that whenever a value in t is 1, it will output five zeros onto a row vector. Whenever the value of t is 2, I want it to output 5 ones to the same row vector. When the value of t is 3, I want it to output 5 twos onto the row vector. I want it so that my ending vector will be [0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 2 2 2 2 2]. Right now, it is only showing [0 1 0 1 0 2], so basically it is only outputting the value that I want once. How can I make it output the same number that I want 5 times instead of just once?
t = [1, 2, 1, 2, 1, 3];
d = 0;
for n = 1:length(t)
if (t(n) == 1)
for k = 0:4
k = k+1;
d(n) = 0;
end
elseif (t(n) == 2)
for k = 0:4
k = k+1;
d(n) = 1;
end
elseif (t(n) == 3)
for k = 0:4
k = k+1;
d(n) = 2;
end
end
end
display(d)

Best Answer

A 'correct' version of your code, with all the pointless loops could be:
t = [1, 2, 1, 2, 1, 3];
d = zeros(1, numel(t)*5); %at least predeclar d with the correct size.


idx = 1; %to keep track of where we are in d


for n = 1 : numel(t)
if t(n) == 1 %note that using switch ... case statements would be more elegant than if.. elseif...

for k = 1:5
d(idx) = 0;
idx = idx + 1;
end
elseif t(n) == 2
for k = 1:5
d(idx) = 1;
idx = idx + 1;
end
elseif ((n) == 3
for k = 1:5
d(idx) = 2;
idx = idx + 1;
end
end
end
display(d)
Now of course, the k loops are completely pointless, so we could simplify that to:
t = [1, 2, 1, 2, 1, 3];
d = zeros(1, numel(t)*5); %at least predeclar d with the correct size.
idx = 1; %to keep track of where we are in d
for n = 1 : numel(t)
if t(n) == 1 %note that using switch ... case statements would be more elegant than if.. elseif...
d(idx:idx+4) = 0;
idx = idx + 5;
elseif t(n) == 2
d(idx:idx+4) = 1;
idx = idx + 5;
elseif ((n) == 3
d(idx:idx+4) = 2;
idx = idx + 5;
end
end
display(d)
Now of course, we're just repeating the same code in each of the if with the only difference being the value assigned, so they're also completely pointless:
t = [1, 2, 1, 2, 1, 3];
d = zeros(1, numel(t)*5); %at least predeclar d with the correct size.
idx = 1; %to keep track of where we are in d
for n = 1 : numel(t)
d(idx:idx+4) = t(n)-1;
idx = idx + 5;
end
display(d)
An of course, even the for loop is pointless. As per Stephen's answer you can use kron, or you can use repelem:
t = [1, 2, 1, 2, 1, 3];
d = repelem(t-1, 5)