I have came across this problem very often, but always ended up solving it in a different way each time. Here is what looks to me to be the most concise way of doing it.

Indexing the diagonal

>> A = magic(4)
A =
16     2     3    13
 5    11    10     8
 9     7     6    12
 4    14    15     1

>> A(1:length(A)+1:numel(A))
ans =
16    11     6     1

>> A(1:length(A)+1:numel(A)) = 1
A =
 1     2     3    13
 5     1    10     8
 9     7     1    12
 4    14    15     1

Selecting off-diagonal entries

>> A = magic(4)
A =
16     2     3    13
 5    11    10     8
 9     7     6    12
 4    14    15     1

>> A(setdiff(1:numel(A), 1:length(A)+1:numel(A))) = 0
A =
16     0     0     0
 0    11     0     0
 0     0     6     0
 0     0     0     1
>>


blog comments powered by Disqus

Published

28 September 2011

Tags