# filling a matrix with a loop

3 views (last 30 days)
bus14 on 14 May 2019
Edited: Stephen23 on 16 May 2019
Hi community,
I want to create a large matrix 400x400, In this matrix I want it to have the form
A= [1 1 0 1 000000000000000000........;0 1 1 0 1 00000000000000......; 0 0 1 1 0 1 00000000000000000] and so on till it is a 400x400 matrix.
I could not find a way yet to easiliy do this. As doing this manually is way too much work.
Does anyone know how to do this?
Adam Danz on 14 May 2019
Edited: Adam Danz on 14 May 2019
What's the pattern? Are you just shifting [1101] down by 1 index to the right and padding the rest of the array with 0s?
bus14 on 15 May 2019
Yes exactely this

Stephen23 on 14 May 2019
Edited: Stephen23 on 14 May 2019
"Does anyone know how to do this?"
This is simple and efficient with toeplitz:
>> C = [1,zeros(1,399)];
>> R = [1,1,0,1,zeros(1,396)];
>> M = toeplitz(C,R);
>> size(M)
ans =
400 400
>> M(1:9,1:20) % first rows and columns
ans =
1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0
>> M(392:400,381:400) % last rows and columns
ans =
0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
bus14 on 16 May 2019
This worked perfectly for my described situation. However, I found out that I was using the wrong matrix..
Should be a 800 x 400 matrix which looks like
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
so like these two 2 colums which repeat itself every time.
Tried fixing it with Toeplitz again but toeplitz cannot handle 2 input columns.
would there be some sort of other matrix creating function that can do this?
Stephen23 on 16 May 2019
Edited: Stephen23 on 16 May 2019
C = {[1,0;1,1;0,1;1,0]};
M = blkdiag(C{ones(1,200)});
Checking:
>> size(M)
ans =
800 400
>> M(1:12,1:16)
ans =
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0

Alex Mcaulley on 14 May 2019
A = repmat([1 1 0 1 zeros(1,396)],400,1);
A = cell2mat(arrayfun(@(i) circshift(A(i,:),i-1) , 1:size(A,1), 'UniformOutput',false)');

Jos (10584) on 14 May 2019
% clever indexing trick
A= [1 1 0 1]
N = 10 ; % smaller example! 400 in your case
X = triu(toeplitz(1:N)) ;
X(X > numel(A)) = 0 ;
tf = X > 0 ;
X(tf) = A(X(tf))

Andrei Bobrov on 15 May 2019
Edited: Andrei Bobrov on 15 May 2019
out = full(spdiags(ones(400,3),[0,1,3],400,400));