MATLAB Answers

0

How can I create a matrix of alternating 1s and 0s for any size matrix?

Asked by Thomas DiMauro on 8 Apr 2015
Latest activity Edited by Stephen Cobeldick on 18 May 2018
I am trying to script that will display a square matrix of alternating 1s and 0s.
ex: 1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1
I have found that my solution works only for odd values of n, but not even values of n.
Here is what I have so far:
function y=exercise1(n)
%create a square matrix of size n x n
if rem(n,2)== 0
m = zeros(n,n);%displays a matrix of zeros
m(1:2:end,2) = 1 %extracts odd elements from column 2 and makes them a 1
m(2:2:end,1) = 1 %extracts even elements from column 1 and makes them 1
else
mod(n,n)
m = zeros(n,n);%displays a matrix of zero
m(1:2:end) = 1 %extracts all odd elements and makes them a one
end

  2 Comments

function a = AlternateZeroOnes(n)
a=ones(n);
if rem(n,2)
a(2:2:numel(a))=0;
else
a(n+1,:)=1;
a(:,n+1)=1;
a(2:2:numel(a))=0;
a(n+1,:)=[];
a(:,n+1)=[];
end
end
@Dipesh Mudatkar: expanding with an extra column is not required, as only adding the extra row makes any difference to the linear indexing. So you could just use this:
a(n+1,:)=1;
a(2:2:numel(a))=0;
a(n+1,:)=[];
To avoid the first resizing and moving of the array in memory you could easily create the array with the correct size in the first place:
function a = AlternateZeroOnes(n)
if rem(n,2)
a = ones(n);
a(2:2:numel(a)) = 0;
else
a = ones(n+1,n);
a(2:2:numel(a)) = 0;
a(n+1,:)=[];
end
end
Unfortunately with this concept there is no way to avoid the second resize and move in memory.

Sign in to comment.

2 Answers

Answer by Stephen Cobeldick on 8 Apr 2015
Edited by Stephen Cobeldick on 8 Apr 2015
 Accepted Answer

You could use toeplitz for this:
>> toeplitz(mod(1:n,2))
ans =
1 0 1 0
0 1 0 1
1 0 1 0
0 1 0 1

  2 Comments

And just for completeness...
If the rows~=columns:
>> toeplitz(mod(1:3,2),mod(1:5,2))
ans =
1 0 1 0 1
0 1 0 1 0
1 0 1 0 1
and if the first value should be zero:
>> toeplitz(mod(0:2,2))
ans =
0 1 0
1 0 1
0 1 0

Sign in to comment.


Answer by James Tursa
on 8 Apr 2015

1 - mod(bsxfun(@plus,(1:n)',1:n),2)

  0 Comments

Sign in to comment.