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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab的计算是以矩阵为单元,有着强大的矩阵处理功能,使用时应该多用矩阵或向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。
- p# u( P  F3 p" [5 \# w7 @' G$ @7 d0 Q1 I0 {" R1 j5 p
MATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑0或1去判断对应位置的元素是否被选择,所以矩阵和逻辑阵维数必须一致;是不是可能有点不明白,贴个例子你就懂啦:
9 K; B/ Z* f# j% Q7 _) X' j. E; z
2 ]5 v& h* l" y: i3 j5 |>>A=[-1 1;3 -2]
* T, U4 P! e' `0 M# qA =9 w2 T- Q" p7 m
   -1     1
0 ?4 d( n6 F+ c    3    -2- `* N+ \# m; S$ \) @) `
>> A > 0    %得到逻辑矩阵8 r. z: P: o$ l/ \8 t
ans =
" A+ \9 @, q7 T    0     1
+ V6 W9 m, n. @8 ^0 L4 Q    1     0* G8 T) L( a# K8 D6 z" X$ e
>> A(A > 0)   %逻辑索引,逻辑1对应的元素被选中,按列选择
9 j* A, _6 @3 [$ pans =
0 t+ i% v/ {: `: Q1 u    3& ^' L3 a' g# u5 U7 P# X2 w
    1
+ J3 c5 f( b# l0 @( B%当然,我知道你想得到的是酱紫的& y+ _" W1 P: E1 i8 t
ans=& n* {. B2 b; M% A* u' v
    0     1+ H) Z8 V; k2 i8 X: w6 `1 w
    3     0
1 {1 Q8 l5 a, d. `%这个可以这样得到:
0 E/ r8 a6 ~, |% k- e& [>>A.*(A > 0)   %此方法就是矩阵运算的好处,可以用来取满足条件的数,不必用循环,注意是点乘
- |7 }& d0 h; U9 j* R, R
/ x; k  p0 E" o' h& l, T
9 q- q* o; M3 C1 \另外,如果你要把矩阵中满足一定条件的数赋新值
0 Z! G& |7 [7 y  `6 v% \$ G1 k: J, ^3 b& y& a/ N3 q1 ]! n, B
比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
8 I6 C8 h* c4 Y: u# J; [( ~
% w& y; n& u( \7 n+ O" X5 O7 i+ Farray(array>1)=0;
2 Y, P: X7 ^6 G& F: b0 E6 f0 b3 `
- h0 ^$ r5 z7 y' i" z把大于1小于3的变成0。/ T! i$ X% U7 c  j5 q, v$ f9 i6 Y

* D2 c. M( T& darray(array>1 & array<3)=0;8 q% ~/ v4 b, G: Y/ [
7 J( _# I6 X& M; b, V
当然,还可以使用find,这个也很好用。" c- ~& D+ T' N/ H
7 o9 v0 t" R5 w0 T/ B) m! r) P1 S
但是,当你要把矩阵中满足一定条件的数做运算时,$ @" l+ `# c0 c

, K+ A1 ^: H/ w比如,把array数组里面大于50的数减去50,其他数不变,如果用上面的等式就不太行啦:
" }  r- t9 v( N" r" [, I9 S% o7 E; f1 |( l
>>array=[51 34;57 23;45 89]  Y3 @" ?0 O3 G! d# _) v
array =
* n/ F7 U9 Q5 `/ a1 ~4 f  Y3 ~) `/ B$ n
    51    34
; P) g, y- ~3 X: v; X6 b    57    23; h8 c3 }& \. ]+ M0 r1 Z( w8 k
    45    893 R& q5 j% S( T5 o' }$ G- X# H
>>array(array>50)-50( g% _& N7 r# G" b5 Y9 r
3 P$ V2 l+ S) O. Z6 U; T
ans =
. N7 i( g" K& I! C& ?: {  C; @     1( G: I8 \9 [5 f- U  n
     71 a. W4 w# x5 w, J, j8 L% l. o- h4 Y
    39
: O: |/ e& Q8 ~7 U+ w' F
6 c8 {6 b" K! T8 K# q0 n5 B% O# S这显然不是我们想要的结果,但是怎么会没有解决的办法呢,MATLAB这么强大,看下面' J" O) l0 q& }+ h* w, u& p5 D

. w# Y5 C/ L; [. ?1 ~) q>>array(array>50)=array(array>50)-50
5 k  n8 v& a4 k1 o  u" c( |2 Uarray =+ p/ l6 C2 C0 t; [. u8 x
    1    34% r' T1 |2 s/ C+ m' o
    7    23
0 N0 P" Y; w0 O$ ]" I& [8 U; D    45   39. h( Y" z$ v7 v- a

; W, n3 Y* V, R) F这个问题在我毕设的时候也困扰了我很久,如果用循环的话,未免low了点,这个方法就很实用。
3 K% T! l" i1 n0 f! B3 {6 [  E' s1 Z. ?) V7 N
% J5 t9 O' m( U" q/ w

( o; j9 N( U& S6 B
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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