How to fill in this matrix?

3 views (last 30 days)
Lindsey
Lindsey on 14 Oct 2013
Edited: Sean de Wolski on 14 Oct 2013
I have a 3x1536 matrix named time
On the 2nd row I'm trying to fill it in with hours of the day but I need four of each hour so for example:
1 1 1 1 2 2 2 2 3 3 3 3...24 24 24 24 1 1 1 1 2 2 2 2 and so on
.
I have no idea how to go about indexing the matrix in a way that I don't have to write then modify 96 loops/indexing lines of code because I have to fill it out in the only way I can think of right now which is:
for a=1:96:1536
time(2,a)=0;
end
.
for b=2:96:1536
time(2,b)=0;
end
...
for e=5:96:1536
time(2,e)=1;
end

Accepted Answer

Azzi Abdelmalek
Azzi Abdelmalek on 14 Oct 2013
Edited: Azzi Abdelmalek on 14 Oct 2013
Edit
n=1536/4
c2=repmat(1:n,4,1);
time(2,:)=circshift(mod(c2(:)',24)+1,[0 4])
%or
n=1536/(24*4)
a=repmat(1:24,4,1)
time(2,:)=repmat(a(:)',1,n)

More Answers (3)

Walter Roberson
Walter Roberson on 14 Oct 2013
time(2,:) = reshape(kron(1:24, ones(16,4)), 1, []);
  1 Comment
Andrei Bobrov
Andrei Bobrov on 14 Oct 2013
Edited: Andrei Bobrov on 14 Oct 2013
reshape(kron(1:24, ones(16,4))',1,[])
or
reshape(kron((1:24)', ones(4,16)),1,[])

Sign in to comment.


Andrei Bobrov
Andrei Bobrov on 14 Oct 2013
reshape(repmat(1:24,[4,1,16]),1,[])

Jos (10584)
Jos (10584) on 14 Oct 2013
There are many roads to Rome. Here is another generic and fast solution:
% example data
time = zeros(3,26) % in your case: 3-by-1536
Nval = 6 % in your case : 24
Nrep = 3 % in your case : 4
% engine
time(2,:) = mod(floor((0:(size(time,2)-1))/Nrep), Nval) + 1

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!