How can I set specific Elements of a Matrix to zero without a for loop

3 views (last 30 days)
Here is my problem:
o= ones(3,3) % Given Matrix
o =
1 1 1
1 1 1
1 1 1
i = [1 2 2]; % column index of o, which should be set to zero
% quantity of rows in o is always exactly the same like length(i)
The result after manipulating matrix o depending on i should be:
o =
0 1 1
1 0 1
1 0 1
My simple solution
for k=1:length(i)
o(k,i(k))=0;
end
How can i do that without a for loop. In fact, the number of rows of matrix o is 10 000.
Thank you very much!

Accepted Answer

Andrei Bobrov
Andrei Bobrov on 2 Jun 2015
Edited: Andrei Bobrov on 2 Jun 2015
o= ones(3,3);
ii = [1 2 2];
[m,n] = size(o);
o(sub2ind([m,n],(1:m)',ii(:)')) = 0;
other way
n = 3;
out = ~accumarray([(1:n)',ii(:)],1,[3,3]) + 0;
  1 Comment
Immanuel Roßteutscher
Immanuel Roßteutscher on 2 Jun 2015
Great, thank you very much!
I changed
o(sub2ind([m,n],(1:m)',ii(:)') = 0;
into
o(sub2ind([m,n],1:m,ii(:)')) = 0;
Because it seems that for
sub2ind(A,B,C)
B and C, always have to be column vectors.
Do you think sub2ind is faster conpared to using the for loop?
Not yet tried your second solution.

Sign in to comment.

More Answers (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!