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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab的计算是以矩阵为单元,有着强大的矩阵处理功能,使用时应该多用矩阵或向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。
! e5 }) R) J+ r
, n4 [8 v/ V# o7 Q( g0 TMATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑0或1去判断对应位置的元素是否被选择,所以矩阵和逻辑阵维数必须一致;是不是可能有点不明白,贴个例子你就懂啦:5 [" `" {2 T- [3 w
1 K: k! X4 s7 s. P1 T5 a& U5 M5 B
>>A=[-1 1;3 -2]
: X: e* Q) C. @) aA =
( z/ P# Q, c4 P/ `# J/ j0 K- k# J   -1     11 j" G/ f! {+ y+ Q) l
    3    -2+ |) }& B6 }1 Y3 P) l
>> A > 0    %得到逻辑矩阵
" I( M" j% n3 B! S: |1 i( |: G# ~9 [ans =) b; L8 o2 z5 ?4 ]
    0     1( e+ r  b! L$ m, Q
    1     04 {( w7 b# a2 Q; z8 Q
>> A(A > 0)   %逻辑索引,逻辑1对应的元素被选中,按列选择
3 \4 z1 C* ^$ Z0 u8 Aans =- c: O6 c) ^) `2 ]: C! f7 e# t
    3
9 |: v* K7 E5 I    1
, k# Y7 b) ?! W( O7 D) d/ N%当然,我知道你想得到的是酱紫的; ]/ z" t) }% t5 R" n; h! b& i* a8 t
ans=5 a# r. z9 D: N. o6 v
    0     1
& R& u& k. M1 A1 m; L    3     0* ^7 h( }- t9 [1 ~' Y
%这个可以这样得到:
# g4 J  l# ~# y8 ^( C>>A.*(A > 0)   %此方法就是矩阵运算的好处,可以用来取满足条件的数,不必用循环,注意是点乘
3 Y! Z5 Y- Y) P5 K+ j) n! n% ]! @' a/ S" Y8 c2 c2 h) Y2 }/ [' ?

) j% T" @. M6 C/ W% |+ b4 J另外,如果你要把矩阵中满足一定条件的数赋新值
% M5 _+ s* S) j% n5 \1 l2 l, a8 q8 s. {7 Y7 I3 p7 w
比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
1 [- d& e" g3 r$ P9 \& e3 k- N4 z0 E( ]& k" b1 {5 q' M
array(array>1)=0;
0 E) ~% V; x7 P( W' g" M
0 T/ p1 R/ O) T/ S2 k6 y把大于1小于3的变成0。
$ p& S! e4 _" w8 \! {7 i9 n* _* Y& ~0 s' o3 `/ _
array(array>1 & array<3)=0;8 g  C1 s0 s4 Z. z% \0 r$ h; K
! A- {# ^, r7 O( j  f, T
当然,还可以使用find,这个也很好用。
& N4 K' x  e3 X+ H5 R0 U8 f# ~' ~. o
但是,当你要把矩阵中满足一定条件的数做运算时,
# i& G- m1 m7 b0 w4 G$ M4 @( E+ S; s$ S# {
比如,把array数组里面大于50的数减去50,其他数不变,如果用上面的等式就不太行啦:
$ P0 f- X5 Y& ^! R% _
/ T: E; K+ O5 Y& s, `* X1 c$ e >>array=[51 34;57 23;45 89]4 C+ B- i: U: M3 [* A  y2 `
array =
& k  a$ p) g8 ]2 P9 U& @& D/ N9 G5 }: b% b, i
    51    344 I* p1 S6 D; ~/ X$ l
    57    23
6 v4 v5 |+ W+ C) b$ P; t) S    45    89
/ H$ v6 ?, v1 |' A+ N4 R>>array(array>50)-50! z+ j2 \, {) w" I! M5 y# }
0 V  X) B1 G5 q) T1 {# ^' N
ans =! n7 I9 i% }1 F
     1$ S( c, d2 [6 O* I9 ?, \) E
     7
3 B: ~% B1 P( t9 o* u9 A    39
3 e$ x! }) r) z) w# j. B2 }  ]# t
5 X& O6 Q/ L! w" d* T这显然不是我们想要的结果,但是怎么会没有解决的办法呢,MATLAB这么强大,看下面/ z: O% F; E4 d1 Y

1 F, B1 N! `: c4 q' R>>array(array>50)=array(array>50)-50- ]3 j3 Y1 \6 K+ P! n% g6 H
array =
% \$ k2 D8 A+ b+ C1 d6 ^    1    34
. D  h: O6 S$ E& h3 D    7    23
$ y0 N& R# o) ?3 I- Z  Z* [    45   39% k# y# l6 L. e% r% W( p) t
6 a" \8 f8 d* P1 F0 D
这个问题在我毕设的时候也困扰了我很久,如果用循环的话,未免low了点,这个方法就很实用。3 {) C6 T+ J% ^" r( T0 d2 ]

2 P& o3 K7 `$ K( m! u$ z6 n  U* J8 W- r# y. ]( u! _9 n; K
, L9 n1 ]" n, o" `6 N
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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