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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab的计算是以矩阵为单元,有着强大的矩阵处理功能,使用时应该多用矩阵或向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。
9 g+ K4 @. E  u4 l. s- {2 [1 U5 k) r, ~- Y' l
MATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑0或1去判断对应位置的元素是否被选择,所以矩阵和逻辑阵维数必须一致;是不是可能有点不明白,贴个例子你就懂啦:
% n, ^5 S0 n8 V  z+ U, ^
4 n3 R+ |! d( Y8 [9 e' q, F>>A=[-1 1;3 -2]% U. J  B" {* D% D: D
A =7 K& ?/ M) G  L
   -1     1
( Y4 C/ X7 j5 N9 V    3    -2
) Y" @4 {! {' ?1 q( r>> A > 0    %得到逻辑矩阵
9 d. J2 K4 j  v% J7 Z/ Z+ Z) xans =
/ u' p& e. `( |8 ^" @: ?( S0 ?    0     1
1 m3 P7 M9 p* i9 e; {# _8 @/ x& i    1     0' j- F0 I. [* t
>> A(A > 0)   %逻辑索引,逻辑1对应的元素被选中,按列选择; m- z$ |: Z$ |- t9 o& F* j
ans =
# X* ^$ T' K( X4 E$ e: z" j    3
; L/ z3 D/ l, ~. Q$ Z0 j  y    10 ^3 G. a) M) ?
%当然,我知道你想得到的是酱紫的# r+ H% Q# d- x( Y! D0 h
ans=
6 [* M2 R/ M: F0 C# h3 y    0     13 [# C, q1 j5 `( v$ W# d2 v9 Y
    3     0
. z+ i# l8 J. h%这个可以这样得到:. {( H" {5 U" g' v3 i7 V/ M3 p
>>A.*(A > 0)   %此方法就是矩阵运算的好处,可以用来取满足条件的数,不必用循环,注意是点乘
, |/ s* w; x% E! i% r; Q
! t) _$ w2 \6 l$ q. o
  j4 E: c# ]* ?, f  P另外,如果你要把矩阵中满足一定条件的数赋新值
" F  ^  Z4 B/ }- l
! M7 O* I& o+ ~) a比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
! Y5 _- Z" W" c! e! M- y, A+ m3 X1 B' F6 k* m
array(array>1)=0;
$ H' z- U9 h! c
( n, k* s' f" q; ~7 S* f$ [7 X( ]把大于1小于3的变成0。
' _0 ~7 L, X. u5 J+ K
, X* }3 y# x1 V4 Aarray(array>1 & array<3)=0;, N5 _' S: z7 N1 S7 \# E
+ o3 y" `" U7 j1 K6 W) I
当然,还可以使用find,这个也很好用。: C& J7 L+ I  n- _* h
  g/ D% u6 }+ {4 Y. M- v9 ]9 B
但是,当你要把矩阵中满足一定条件的数做运算时,' y) b/ L7 M) p8 \$ W7 u

/ I  g) w+ c, |7 Q& V比如,把array数组里面大于50的数减去50,其他数不变,如果用上面的等式就不太行啦:4 ?' ]0 A$ F2 `0 f! H, ~
% m+ K& [" A' ~" |1 d
>>array=[51 34;57 23;45 89]7 c% H7 u% |: s) s) z! u8 S
array =
) Z9 f8 |$ T( `9 l, S1 M! {0 _
7 [: K0 w7 U1 x% I: R    51    34* l/ k& ~% P) k& s) R) h, N
    57    233 K/ b1 |+ O: Y8 |. B
    45    89/ @- H/ P" R) i- F! M- I% u
>>array(array>50)-50
  d% l* A& G% J; h: s+ D& I: h2 R! H# L3 B; Z6 R
ans =
1 N1 v, Z( a  t+ Q     14 f$ U5 [6 a) B1 W, S' O
     7; H0 L: a/ P0 |. Z  U/ P
    391 B) E; O: {0 @4 m$ `6 f# R

! j- p6 z; }: |  M) ~8 G! I这显然不是我们想要的结果,但是怎么会没有解决的办法呢,MATLAB这么强大,看下面, @  `" D* M9 J( i' @) D
0 N1 }! g  ?& k) A* {* j" l2 L" H
>>array(array>50)=array(array>50)-50
. l6 Y" r/ Q& q2 tarray =
% O9 a- x& M: w* S    1    34
# h7 b7 r8 O# {# G9 G2 i    7    23
/ R; K4 I8 x) ]& |8 h. m8 x/ [! s    45   39& a+ b8 [5 L/ L
, ?/ ?" n, C, }/ N" X
这个问题在我毕设的时候也困扰了我很久,如果用循环的话,未免low了点,这个方法就很实用。4 V1 I7 \+ _# d4 X

/ _1 z9 h+ X/ E" C6 |! C' u/ w- ?" r8 f9 f

8 z3 B1 W0 v1 P0 L7 g/ [# _  H
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-12 12:56 , Processed in 0.062500 second(s), 23 queries , Gzip On.

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

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

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