Select everything NOT returned by index

57 次查看(过去 30 天)
Hello,
Apologies if this is a stupid question, but I haven't found a way to properly google it.
I have an index where certain conditions are met, but I want to make everything outside of that index NaN.
e.g.
x=find(wind(:,:,1)>0&wind(:,:,2)>0);
wind(x)=NaN; % But I actually want the parts not indexed to equal NaN
I'm looking for something like
wind(~x)=NaN
but that doesn't work. I can't just change my > sign around either because of the range of values in my matrix.
I'd just like to find a way to apply wind(x)=NaN to the values NOT in x.
Thanks, Claire
  3 个评论
Claire
Claire 2014-11-26
Yes, but in my case it's not quite so simple. I have values in x between -1 and 1 and values in y between -1 and 1. I'm trying to isolate the area where both x and y are positive, and make the rest NaN. Simply swapping the > sign to a < sign will only then isolate where both x and y are negative.
I could always do it in two steps, but I can easily index to find the quadrant I want in one statement, and I was hoping it was just a case of selecting everything outside of that indexed quadrant to make it NaN.
John D'Errico
John D'Errico 2014-11-26
编辑:John D'Errico 2014-11-26
Claire - read my comment. See that Oleg did as I did, changed the & to an or. It is time to go back to basic logical operator school. Um, maybe Venn diagrams?

请先登录,再进行评论。

采纳的回答

Roger Stafford
Roger Stafford 2014-11-26
You can always do logical indexing using the negation of whatever condition you have.
t = wind(:,:,1)>0&wind(:,:,2)>0;
wind(~t) = NaN;
  2 个评论
Claire
Claire 2014-11-26
Thank you. It seems my problem was with using "find" and when I changed it to "x=", the ~ operator worked.
Thanks! Claire
Jan
Jan 2017-9-30
+1. The logical indexing is faster than the indirection over find.

请先登录,再进行评论。

更多回答(2 个)

John D'Errico
John D'Errico 2014-11-26
Why can't you change the inequalities?
x=find(wind(:,:,1)<=0 | wind(:,:,2) <= 0);
I'm listening, but your statement makes no sense as to why not. Basic logic tells us that:
~(A & B) == ~A | ~B
As trivially,
x=find(~(wind(:,:,1)>0 & wind(:,:,2)>0));
Finally, and equally trivially, but considerably less efficient because it is an extra and wholly unnecessary step, you might read up on what setdiff does.
doc setdiff
  4 个评论
Claire
Claire 2014-11-26
I simple, "you misunderstood my response" would have sufficed, without the additional backhanded insults.
Roger provided the answer to the question I had asked, so the problem is now sorted. Thanks.
Oleg Komarov
Oleg Komarov 2014-11-26
Claire, you kept answering my comments and John's answer with your copy-paste text without even reading carefully. If there are two people telling you the same thing, and taking their time to do that in an elaborate clear way (John), it is not nice of you to paste the same sentences. I do not see much of an insult in the statement that you are missing the basics of logical truth tables (<http://en.wikipedia.org/wiki/Truth_table>) but an opportunity to go and check them out again, since much of programming is based on that.

请先登录,再进行评论。


Mallory Nation
Mallory Nation 2019-9-25
编辑:Mallory Nation 2019-9-25
For fun, to do what was wanted using find, you could do this:
xNot = setdiff(x,1:length(wind(:,:,1)));
wind(:,:,xNot) = nan;
But as already stated, the best way is to not use find at all.

标签

Community Treasure Hunt

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

Start Hunting!

Translated by