I have a 4x4 array of 1's and I need to turn 3 of 4 ones to zero per row at random. So there will be a one 1 left in each row.

2 views (last 30 days)
A = [1 1 1 1; 1 1 1 1; 1 1 1 1; 1 1 1];
B = [1 0 0 0; 0 0 1 0; 0 1 0 0; 0 0 0 1]; % An example

Accepted Answer

Jan
Jan on 8 May 2022
Edited: Jan on 9 May 2022
Instead of starting with ones and set all but one to zero, it is cheaper to start with zeros and set one element to 1 per row:
n = 4;
A = zeros(n, n);
A(sub2ind([n, n], 1:n, randi([1,n], 1, n))) = 1
A = 4×4
0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1

More Answers (1)

the cyclist
the cyclist on 8 May 2022
Here is one way:
N = 4;
x = (1:N)';
y = randi(N,N,1);
linearIndex = sub2ind([N,N],x,y);
B = zeros(N,N);
B(linearIndex) = 1
B = 4×4
0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0

Categories

Find more on Creating and Concatenating Matrices 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!