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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab的计算是以矩阵为单元,有着强大的矩阵处理功能,使用时应该多用矩阵或向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。5 t1 Y& w- ^6 B3 x  T0 _

) ]7 I3 f5 d5 ]% d! X5 {& |7 HMATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑0或1去判断对应位置的元素是否被选择,所以矩阵和逻辑阵维数必须一致;是不是可能有点不明白,贴个例子你就懂啦:
  O6 B5 ^# p8 h) Q" B5 S3 \$ L% s+ {! I4 _- c4 H; ]* ^
>>A=[-1 1;3 -2], R( x8 V$ z. M: }7 v8 _9 X8 m1 P
A =
; w( d0 r  R9 j) ^   -1     1
' o: w3 }8 e& r1 S2 q: ?) }    3    -2: x& P( }9 ?& n/ @" t8 g; n
>> A > 0    %得到逻辑矩阵+ h5 s# \3 m  s3 P2 @8 c. l- a
ans =
6 g- V0 S, ]$ n5 L4 N    0     1; ?& ~! S, q, {% e+ a' j
    1     0( h: @: g8 n4 a( a3 a  Y
>> A(A > 0)   %逻辑索引,逻辑1对应的元素被选中,按列选择
4 ^! R1 M  a& \+ _7 Rans =3 N/ B6 }  j% U$ O
    3
4 `7 c* t5 D# w1 Z4 ?    1' l- t" ?9 D# M7 n$ b
%当然,我知道你想得到的是酱紫的
: i; M7 N+ o3 \. Ians=
4 B4 r- q- b! Q, h$ Z    0     1
) X' M) e% u0 u# ]! A/ I    3     0# a! L' R9 }* C' }4 @; g
%这个可以这样得到:
/ X$ X9 g+ _; F9 e>>A.*(A > 0)   %此方法就是矩阵运算的好处,可以用来取满足条件的数,不必用循环,注意是点乘
8 P9 O, c& p4 p1 D3 v; t5 ]
! J& @' T+ R# o8 D4 B/ v# _
, e8 m" x/ H' _" q5 F+ Q5 s另外,如果你要把矩阵中满足一定条件的数赋新值
% C1 q% Y3 L2 A. p6 [0 w/ {; O, `' A0 y/ v/ q
比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
, b, a' O: n1 T( M: w9 k& H" m6 P; W
array(array>1)=0;
/ `9 Z6 ?; z9 c$ a
3 `; g# _- S5 l* [( I, e把大于1小于3的变成0。
4 ~. H- Z$ n& W  a
7 U. W! m, [" r; A7 t2 R+ Sarray(array>1 & array<3)=0;5 s" p% Q3 F2 H: o5 G8 c0 W& `
5 X9 x1 f0 |( D  K
当然,还可以使用find,这个也很好用。
3 {4 [, F# `9 b0 K# Z& D3 w1 h* d! o' Q  j3 k$ u% p
但是,当你要把矩阵中满足一定条件的数做运算时,
. Y2 E( G3 z$ }
1 R# s! f+ ^7 S7 E$ Z6 u比如,把array数组里面大于50的数减去50,其他数不变,如果用上面的等式就不太行啦:' W/ n) t. b! E" y: h" Z# Q

- i7 R8 W' Q7 d  P! v( X! l >>array=[51 34;57 23;45 89]% `9 P4 T) K$ W% A0 p: I8 {
array =
( _* i  F6 I; a$ |& k1 S4 V0 b/ R& `9 u" `& G
    51    34
9 n7 [+ J- Z0 b* v) M+ C: g" C    57    23- v/ d6 I1 i- f/ o- Q. F
    45    89
' ]  Q2 z" F1 T! N  v! @>>array(array>50)-508 L  h4 T% L  ]4 J3 A% |5 ?

5 Z& x3 K. A; E" L3 f- tans =! M2 z* c- A0 B4 e8 l. g2 h2 B
     1
' K! E0 K$ T* H4 q$ u0 f% C     7
3 X  Z9 T! Z. N/ Y# ]    390 F( {8 Z2 ^+ g. M

7 M; V8 h5 b9 m这显然不是我们想要的结果,但是怎么会没有解决的办法呢,MATLAB这么强大,看下面
0 F$ \7 C3 p8 K) x% }% p6 l" |9 k- T
>>array(array>50)=array(array>50)-50/ \4 ?0 }- p/ @$ \$ C# Q3 s' v# Z. ]
array =5 O& j, T+ [, a  @8 @* G8 m
    1    347 D% B* T! w. j0 c& S& \
    7    23
8 a7 v2 f$ t/ J    45   39
6 Z$ t2 C0 k4 k. n& x
7 Q$ H& e7 `1 }# D/ K. S这个问题在我毕设的时候也困扰了我很久,如果用循环的话,未免low了点,这个方法就很实用。
5 t9 i9 S9 x# h5 f- j& t
# f4 z6 F% W* s" M$ t$ T- x' {) }0 S
- x/ J; W0 L0 B8 a3 ~9 S1 f8 t& h$ u& M4 q& L( {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-5 17:28 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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