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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab的计算是以矩阵为单元,有着强大的矩阵处理功能,使用时应该多用矩阵或向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。: ?# g! h4 D* I5 d: b
! h! _+ V1 s' s- t) V* }& I
MATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑0或1去判断对应位置的元素是否被选择,所以矩阵和逻辑阵维数必须一致;是不是可能有点不明白,贴个例子你就懂啦:
9 S! q/ k5 h& R
3 n+ b5 z! M# M! Y3 i" T9 R) S>>A=[-1 1;3 -2]
7 z) J8 V5 H1 y, E* ~0 @A =
& {) o; X9 }# G# z2 |/ U; }% d! G   -1     16 Q4 \) |! n5 f' h! @: p
    3    -2
' D1 |  {$ h- O- K, K0 x>> A > 0    %得到逻辑矩阵" ?* X- n" b4 X) I* d& L( B1 A
ans =' }' b3 `; R6 P5 Y
    0     1( l/ Y9 Y1 {% p+ l0 h# E% Y
    1     0
1 b8 I  E3 Y8 I' _- ]>> A(A > 0)   %逻辑索引,逻辑1对应的元素被选中,按列选择5 J4 E5 }7 |: Y
ans =! T, \5 K8 x# U8 ~% G; m; b
    38 T3 E; I3 f# n3 @% k
    15 |; d9 q6 x- h4 A. Q
%当然,我知道你想得到的是酱紫的* @) w# i  y/ W7 {  [; X: c7 M4 R
ans=
! ^9 ?5 k  u: X; g9 ^7 E  [1 D    0     1
+ Q5 E* D2 e9 Z    3     0
1 v! s; f1 r* p& L4 ^* Y' h; m%这个可以这样得到:
: Q7 ?! i, h" ?2 `  i. p4 N4 i>>A.*(A > 0)   %此方法就是矩阵运算的好处,可以用来取满足条件的数,不必用循环,注意是点乘3 r" n, M% H# G0 a2 m4 N0 ?* _: x
) G* z/ V% L6 @4 E8 I4 i

, a7 l0 B) h3 I3 P! k7 c+ c另外,如果你要把矩阵中满足一定条件的数赋新值4 C" T+ d8 f6 Z& M

4 A  R! r; ?9 a: R* t. y0 C" K比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
; n8 U3 b( r, {" P
& e0 B) y- B3 G! E% ]array(array>1)=0;
, s3 O( R7 z" c3 ?4 k  y
! R2 h7 K- o% D1 q% H( G0 i把大于1小于3的变成0。- S, y4 B$ w. v4 r
* K3 g$ ]3 U5 |6 P" b
array(array>1 & array<3)=0;
1 u% T) o, d8 ^
: U; l2 T( [5 Z! U- x0 ^当然,还可以使用find,这个也很好用。
8 |& T5 X6 C( Y: X& F$ u
2 \: O: Q* E8 A" a6 }! ^' a但是,当你要把矩阵中满足一定条件的数做运算时," z! F& W) l5 R

3 m$ w+ ?4 O' U" K比如,把array数组里面大于50的数减去50,其他数不变,如果用上面的等式就不太行啦:2 \5 S6 B+ ?9 {8 ?
  R. G- l" N' E. H
>>array=[51 34;57 23;45 89]' Y4 }4 m- ]* x; H, x7 D
array =* C2 z) z, N& O; I* u

) O2 o% f8 q) E% |    51    34
5 K9 ?1 F4 u. a/ O" e8 l' j: v% m    57    235 r2 z7 h1 r2 g3 `
    45    89+ {1 l  M' }" L; z1 ]
>>array(array>50)-50
8 [7 `3 ~# H, \8 Z5 ]0 G0 {2 t5 f$ H7 e
ans =
9 d& c# |8 N$ k) [# k2 X     1
; c. g+ m3 n: S$ O4 m/ y! i     7
! M; u3 k) q4 a5 }4 s    39
, f/ ]5 a( L+ c9 K9 w# w! ?1 J- [+ J- R9 G* l* b
这显然不是我们想要的结果,但是怎么会没有解决的办法呢,MATLAB这么强大,看下面3 m0 b2 O+ L0 I% m, |
& i5 a. X1 T# H
>>array(array>50)=array(array>50)-50
5 n: b1 _5 h6 J3 |9 ]/ h( w5 P& harray =
+ v0 D1 G# F0 `- k8 U    1    34
4 f* K+ n9 c' x1 h2 l/ G; P    7    23
! A3 c% I% S4 J0 j  G" z    45   39
% E1 g, E8 C" r* \4 a
0 w/ a9 m0 X$ J5 x* L这个问题在我毕设的时候也困扰了我很久,如果用循环的话,未免low了点,这个方法就很实用。
' L0 [- Y' |# L
/ U! o+ D' a( M+ V* B/ Y7 A
* E+ m; Z! t1 P+ v2 s/ G; D
" L! n- ^6 h% z$ Q
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-1 20:27 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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