爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 19527|回复: 19

[程序设计] 关系、逻辑运算符和find函数介绍

[复制链接]

新浪微博达人勋

发表于 2012-10-21 21:53:53 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
最近发现有人对find函数的用法掌握的不好,所以下面简要介绍其用法。
一、关系运算符和逻辑运算符
首先要明确关系运算和逻辑运算的结果是1(真)或0(假),这一点和大部分编程语言是完全一样的。这一基本东西很重要,往往我们不能熟练运用所学知识灵活编程的原因就在于很多细微的东西不够扎实。
关系运算符包括:<,<=,>,>=,==,~= 共六种。逻辑运算符包括:&,~,|,xor(很少用)。
具体内容不用多说大家都很清楚,如果判断成立就是1,不成立就是0.
下面重点介绍find函数用法。
二、find函数常见用法
1.find顾名思义就是找到。找到符合要求的元素序号!有些人不太明确find出来的结果是什么。一定要清楚返回的结果是符合要求的元素序号,而不是1或0.1和0已在关系或逻辑运算中产生了。find是找到非零数的位置。这是最一般的说法!举例说明:
X = [1 0 4 -3 0 0 0 8 6];
indices = find(X)


indices =
     1     3     4     8     9
这是我们在find函数中不加任何条件判断的结果,可以看出find是把x中非零的元素位置的序号放在indices中。也就是说,find找到的是非零数的所有位置,显示其位置序号。
2.但是我们一般不这么用find,因为我们总想找到满足一定条件的值的位置,所以通常在find中加入关系和逻辑运算。如:
find(X > 2)

ans =
     3     8     9
解读:x>2,这是关系运算,出来的结果是含有1,0的逻辑结果。而刚才说过了,find是找到所有非零元素位置序号,所以现在find把非零元素,即关系和逻辑运算结果只有1或0.所以它把所有1的位置的元素序号返回给ans。
3。如果我们想知道一个二维数组满足条件元素的行和列,可以用以下语法:
[row,col] = find(X, ...)
表示返回满足符合条件元素的行row和列col.如:
A= magic(4)
A =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1
[r,c,v]= find(A>10);
r', c', v'
ans =
     1     2     4     4     1     3
ans =
     1     2     2     3     4     4
ans =
     1     1     1     1     1     1
其中v'是逻辑数组。

基本用法就到这了。下面总结一下:
1.关系和逻辑运算结果是1和0.
2.find的原理是查找数组中非零元素的位置,并返回元素序号。
3.find中包含关系和逻辑运算,其中的结果只有1和0,则find返回所有1所在的序号。

由于大多数人是用find这一逻辑函数处理海洋和大气的数据,下面举例说明find的实际用法。
find其实就像一个指针,一个索引。能帮我们快速定位满足条件数据的位置。
如我们经常要对陆地缺测值设为NaN,如:
sst(sst==-32767)=NaN  %这是一种最简写的方法,解读:括号中是关系运算,返回值中等于-32767的元素是1,其他元素是0.这是返回的逻辑数组(logical array),矩阵sst对真的数据设置为NaN。
还可以写为sst(find(sst==-32767))=NaN  %虽然结果相同,但原理不同!上面是sst对逻辑数据的设置,这个是用find找到满足条件的元素序号,相当于一个指针,对sst中的这些数据设为NaN。

再比如我们要找到西太平洋暖池的东边界,拿来一个sst的数据矩阵,[a b]=find(sst>=28),返回行a和列b。则经度显示:lon(max(b)),纬度显示:lat(a(find(b==max(b))))。这个例子可能有些不恰当,还望各位神人指正!

另外,我们会经常画某一区域的分布图。大部分人会选择先手动计算到底是那个值对应经度和纬度。其实大可不必。用find找到满足条件的经纬度序号,这样很方便的通过条件判断筛选我想要的经纬度,再用contour或contourf画图时,经度纬度就是你find完后的指针,数据的经纬度也是同样的经纬度指针。所以说通过find,找到指针,再得到原矩阵满足条件的值就是反复的过程。如:
height=[63,67,65,72,69,78,75]
accept=find(height>=66)
accept=
  2    4    5    6    7
height(accept)
ans=
67    72    69    78     65  %用指针返回你想要的值

总之,灵活运用find函数可以很方便。要多习惯用计算机帮我们筛选信息。

参考文献:
1. Holly Moore. MATLAB for Engineers Second Edition
2. Matlab R2012a help帮助。

评分

参与人数 1金钱 +10 贡献 +2 收起 理由
言深深 + 10 + 2 matlab顶起

查看全部评分

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-22 09:48:03 | 显示全部楼层
matlab小王子
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-22 11:16:43 | 显示全部楼层
@Aires matlab在你的带动下,最近人气大升
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-10-22 12:25:33 | 显示全部楼层
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-10-22 12:27:00 | 显示全部楼层
windprofiler 发表于 2012-10-22 11:16
@Aires matlab在你的带动下,最近人气大升

是么,没感觉,呵呵。能帮助大家就好~我也在学习中~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-22 14:35:59 | 显示全部楼层
Aires 发表于 2012-10-22 12:25
什么小王子,才用了没几个月,差死了……老五过奖了= =

还不会用的表示不知道有木有压力
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2012-10-22 15:54:38 | 显示全部楼层
topmad 发表于 2012-10-22 14:35
还不会用的表示不知道有木有压力

好吧
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-10-24 13:24:57 | 显示全部楼层
版主哥哥好人!顶~~
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-3-27 15:04:14 | 显示全部楼层
谢谢说明,一直想用find函数!帅!!!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2013-4-18 09:08:44 | 显示全部楼层
刚刚接触matlab,很受教,版主辛苦了
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表