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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab的计算是以矩阵为单元,有着强大的矩阵处理功能,使用时应该多用矩阵或向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。
6 n2 c8 F+ {# _- ]* n4 [- B! W1 w+ l  `( t4 F/ R; `& g8 v4 ?
MATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑0或1去判断对应位置的元素是否被选择,所以矩阵和逻辑阵维数必须一致;是不是可能有点不明白,贴个例子你就懂啦:
, Y& }3 o, Z' n$ w, r: p. n! c$ _. S4 r+ f" j
>>A=[-1 1;3 -2]0 S# S1 i  \; E8 G2 K; _
A =4 x3 R/ s, o  `; p/ S- z: Z
   -1     1
5 O+ Y" a$ a* q# s2 ~( N3 @    3    -2; k' ~3 H* l5 I- N1 I( [2 W+ c' G
>> A > 0    %得到逻辑矩阵
+ [; ], g: t( d; X6 |+ ]ans =1 A5 c3 u( }" ~! d  p6 O' I2 E
    0     1
+ M: ]  f: Q, i" C2 i( U% Q3 J9 K    1     02 d; `/ H1 T5 O' n
>> A(A > 0)   %逻辑索引,逻辑1对应的元素被选中,按列选择
. G4 S+ e: F* ^+ kans =
) v8 l7 P- x3 V    3) P6 W7 I/ x3 j: `' @+ r2 m
    1& d8 w3 k6 u. e3 S
%当然,我知道你想得到的是酱紫的
9 u3 `, [0 f6 b1 B9 rans=. r; f* `9 _$ ~4 I4 _
    0     14 e" R: ]- q4 e4 u% f9 [
    3     01 R4 G0 a: ^; W% L. o
%这个可以这样得到:
) ^( }0 Z5 N- q6 Y& o8 K>>A.*(A > 0)   %此方法就是矩阵运算的好处,可以用来取满足条件的数,不必用循环,注意是点乘
4 E, I: ~6 I5 r: i9 z( a4 `' v2 W6 c8 ?, N) a( A) {' i

6 m' K5 ~! G& K( ?& g  J另外,如果你要把矩阵中满足一定条件的数赋新值
, F- W2 n7 B( b$ `
7 }& p' R2 d3 ?比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
4 C2 t$ N6 p" ]7 I5 R* _% x% J% E4 ?/ ?5 c7 V2 f
array(array>1)=0;/ _7 |5 A- K* Y* D

1 D0 q: ^! o% {5 k/ @- `把大于1小于3的变成0。# C: R8 }5 ?; H- `# S- F& E5 v8 z
4 C. v( }  G& V. ?4 M
array(array>1 & array<3)=0;
# g  L9 W. p7 f, O& g* ~' y- Y( d/ S7 T$ J: d; g
当然,还可以使用find,这个也很好用。/ l  B8 @: U/ Y. x* K( ~% v* N. {

) ^3 V) K/ I9 G& ^% ?但是,当你要把矩阵中满足一定条件的数做运算时,
" ~# `. R( O$ L* r# x; B' m) M
. ?. O2 o- h& L比如,把array数组里面大于50的数减去50,其他数不变,如果用上面的等式就不太行啦:
* L* B0 [) i: W" [9 ^& K& e: V
- N! h3 S3 @6 W >>array=[51 34;57 23;45 89]5 U+ t) v; l4 x- ]2 e# k% G
array =. e' W! }8 a* F3 Z1 W; p  m

) I+ Y3 [* y4 L% P( ]8 W+ ^/ M. s    51    34- q, N( L/ u) [: z4 `
    57    23
3 M$ W) }% T* f3 [& v    45    89$ p( E, p/ z6 @* @
>>array(array>50)-50
5 w9 q/ Z# f5 r0 ^
, A/ M( P* a* G# g4 f0 O1 \ans =! p( L# W) F; a
     1
" w' j' h' [, R6 q$ [* H5 L     75 y' A# K: i$ H
    39* ^) `5 L& k. w! z: K% w( D

$ s+ ^; [4 M$ m4 E, m6 c这显然不是我们想要的结果,但是怎么会没有解决的办法呢,MATLAB这么强大,看下面
' r5 R: S# Q; Q  y
: a) E# Z; O1 Y+ |7 n>>array(array>50)=array(array>50)-50
$ F' k1 R& a" [' L& a$ \, p( farray =/ b8 `( I: z+ Z9 M
    1    343 W1 n$ w+ q' `; ?! E' W+ i) n/ w
    7    23
* F. R2 @# t& O& X) A! c) Z, H- k' q    45   39& K9 O6 ^$ e' _% \8 M

4 C/ x1 y7 D& C& n3 d7 _这个问题在我毕设的时候也困扰了我很久,如果用循环的话,未免low了点,这个方法就很实用。
6 f& v  p) U- a- ^4 n& Q' d  i+ V0 U+ t0 Q7 ]/ z8 h) W/ ~
& L1 f7 D: j, m) r/ N; J) F/ s! a" l) o
) O$ v; U  T9 p  N4 w% d
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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