Indexing and Checking on a Diagonal

35 views (last 30 days)
washer
washer on 1 Jul 2014
Commented: washer on 1 Jul 2014
I'm just getting back into Matlab and am getting tripped up where I'm more familiar with Python or C right now... still brushing the dust off, thanks for any help!
I'm trying to check the values in a diagonal matrix to see if they are non-zero and below a certain threshold with the goal of forcing them to zero. If my 3x3 diagonal matrix is S, I've seen a good way to index a diagonal is
idx = logical(eye(size(S)));
S(idx)
Which will give the values down the diagonal. But I keep getting tripped up on figuring out a nice way to traverse those three values so I can check them and assign them individually. I get that I could assign them all at once by assign S(idx)=value, but how can I index each individually so I can check if it's above/below my threshold?
I know I could also just loop through it and that my be easier/more clear, but I'm darned curious now (and that loop is messy)!
Thanks for any help!

Accepted Answer

Jan
Jan on 1 Jul 2014
Edited: Jan on 1 Jul 2014
The indexing by eye() gets inefficient for large arrays. Then linear indexing is cheaper:
c = size(S, 1);
idx = 1:c+1:numel(S);
Then:
v = S(idx);
v(v < limit) = 0;
S(idx) = v;
  1 Comment
washer
washer on 1 Jul 2014
Thanks Jan! I saw the indexing by eye and thought it was pretty nifty and "must be a cool/optimal Matlab thing." That advice is exactly what I was looking for!

Sign in to comment.

More Answers (1)

Andrei Bobrov
Andrei Bobrov on 1 Jul 2014
one way
S = randi(200,10);
a = 100; % your threshold
d = diag(S); % if d(ii) >= a then d(ii) = 1; else d(ii) = -1 ;
t = d >= a;
d(t) = 1;
d(~t) = -1;
S(eye(size(S))>0) = d;

Community Treasure Hunt

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

Start Hunting!