找回密码
 注册
关于网站域名变更的通知
查看: 808|回复: 1
打印 上一主题 下一主题

学习一下MATLAB中矩阵的逻辑索引方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-12-26 10:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
Matlab的计算是以矩阵为单元,有着强大的矩阵处理功能,使用时应该多用矩阵或向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。
0 ^8 h% a( y# c2 I" R' T5 o4 w; o0 v
9 {0 D+ w( O2 [MATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑0或1去判断对应位置的元素是否被选择,所以矩阵和逻辑阵维数必须一致;是不是可能有点不明白,贴个例子你就懂啦:
1 W$ d3 e" D: m( i6 P- }* v- Y- _& ]4 Y; I* `+ W* `" [; [
>>A=[-1 1;3 -2]
' i- Q' u4 i5 i" Z1 JA =
- Q6 ?- ^. t$ S8 N% a9 C0 v   -1     1
7 O8 }1 @+ }/ o    3    -2
$ r& p0 j# b- D- o% h% y' o5 a>> A > 0    %得到逻辑矩阵
5 R% |: U$ @+ h4 a. O2 S3 Xans =7 y* K. Q+ b% d$ B! f% q
    0     1) m! |% ~& z2 Z6 {5 M  t1 ]$ B+ `
    1     0
" [$ p9 h* z$ [- c: H8 G>> A(A > 0)   %逻辑索引,逻辑1对应的元素被选中,按列选择
8 i1 Z. p+ A' l8 l' C3 x4 t$ Lans =* _/ ?% @% B0 ^( z  x2 q% P
    32 G% @. Q. \. t: _' Y, i
    1% u+ w$ s1 B: _) q
%当然,我知道你想得到的是酱紫的9 Q9 n" K; t$ o- G1 ?* S5 N
ans=
2 K; m5 J' G8 `9 l7 O% T( N    0     11 \! J; |# u/ t% g) Z
    3     0
$ @4 c7 M' q. J* F%这个可以这样得到:
: |/ J( B. h6 n6 _>>A.*(A > 0)   %此方法就是矩阵运算的好处,可以用来取满足条件的数,不必用循环,注意是点乘8 X' \- q" X5 U* S

0 d% g  j4 r% L( Z
+ u& [7 J8 ]$ @另外,如果你要把矩阵中满足一定条件的数赋新值- f; h# A4 Q& B" }1 h: E9 P! ?
$ z- t" J$ ~+ ]" k1 _0 S
比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
  H0 p0 ?  E5 t( n# T/ E. p2 u- ~2 k
array(array>1)=0;
. h# }/ \3 B% y- w
4 O( s$ V& D! g2 V4 w把大于1小于3的变成0。: c  u' s' J8 p, C

6 ]8 L4 O8 @- ?' X( |+ r0 a% \array(array>1 & array<3)=0;* |" ~. ]8 L3 @- N
6 K; K+ Z* A9 s, U1 q# ?
当然,还可以使用find,这个也很好用。
2 ?( i' `5 \, _0 t% L" U2 i
/ U3 g' O  C0 x7 |但是,当你要把矩阵中满足一定条件的数做运算时,
% F: \( d: U; m+ ]! e% G: j6 h$ ]5 Q1 X6 q2 e
比如,把array数组里面大于50的数减去50,其他数不变,如果用上面的等式就不太行啦:
6 N5 E  y# t  s. Q
: X) G) i4 N2 L8 T1 Z >>array=[51 34;57 23;45 89]
* z+ g! e; Q" e6 `8 ]array =
3 Q3 I- k" v3 \2 Q0 l
3 y) d0 o! r8 Z" k& M, h, v    51    34( J$ R: ?  g( i" i
    57    23- ^8 `2 @. @7 s: Q( [# a
    45    89
: N% L2 d$ I5 x>>array(array>50)-506 s) m5 _9 F" J( }

8 N: y, t3 ?$ E9 r9 y7 ]: ~3 N5 W0 eans =+ `, {$ j( \% v! {$ s5 o
     1
. ?) f: s+ ]4 r9 ?" c( w     7+ k! b5 B. k2 b. l& T
    39$ r& Q5 d1 ]( S- X) o

) N" s+ W  u0 h- s9 p% Z8 R这显然不是我们想要的结果,但是怎么会没有解决的办法呢,MATLAB这么强大,看下面) |. `2 R- D2 k
- `* F* d( g7 ]3 H- f6 O) |# ]' B
>>array(array>50)=array(array>50)-50
7 o8 d% T* w' o) Z: o- G3 Y0 parray =
+ l" o5 k3 f: D9 u2 N* Q4 w    1    34
  A# ^0 k* S( P# z  i  N5 r3 ?    7    23- D6 V, t+ j* @6 l1 q
    45   39
/ D8 X: C: x- F6 ^( `3 U
: _* c: _! }# Z这个问题在我毕设的时候也困扰了我很久,如果用循环的话,未免low了点,这个方法就很实用。
! n3 l6 B- C  w" {7 S, A4 w9 H3 c
! u7 r* ~9 F" `
3 [+ F& n% |5 q, r" o2 Q$ A
4 V( {, p4 u% J" z+ H3 o! V
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-10-31 19:26 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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