How to replace the diagonal elements of a matrix with 0 fro avoiding self loops?

I have a matrix
M= 1 0 0 0 1 0
0 1 0 1 0 0
0 0 1 0 1 1
1 0 0 1 0 0
1 1 1 0 0 0
0 0 0 1 0 1
I want to replace all the diagonal elements in this matrix to 0 if it is 1.

1 Comment

Out = M.*-(eye(height(M))-1);
This will make all the diagonal values of your matrix zero as long as the matrix is square. hope that helps :).

Sign in to comment.

More Answers (3)

Method one: indexing:
M(1:1+size(M,1):end) = 0
Method two: eye:
M.*~eye(size(M))

1 Comment

A strict interpretation of the question requires only diagonals equal to one get changed to zero: this is easy to implement with eye:
M.*~(eye(size(M)) & M==1)

Sign in to comment.

If your matrix M is not square and if you only want those diagonal elements changed to zero “if it is 1”, then you can do the following. Other diagonal elements not equal to one will remain unchanged. (Your description was perhaps a little ambiguous on this latter point.)
[m,n] = size(M);
d = 1:m+1:min(m^2,m*(n-1)+m);
f = find(M(d))==1;
M(d(f)) = 0;

4 Comments

Sorry to others, but this is the only right answer to the question.
This does the same in one line.
M = M-diag(diag(M==1))
@Hans Jakob Rivertz: not once you consider non-square matrices.
@Stephen can you help me by try to answer the last question in my profile please

Sign in to comment.

If you are using the graph/digraph classes, you can also tell the constructor not to insert any self-loops for the diagonal elements:
g = graph(A, 'omitSelfLoops');

Categories

Community Treasure Hunt

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

Start Hunting!