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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab的计算是以矩阵为单元,有着强大的矩阵处理功能,使用时应该多用矩阵或向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。$ E. c0 [* G5 g8 Q
+ H' }% C' j% M: N7 `& U# p
MATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑0或1去判断对应位置的元素是否被选择,所以矩阵和逻辑阵维数必须一致;是不是可能有点不明白,贴个例子你就懂啦:
7 {  S. J& U0 j# P& K+ Q) ?4 a* ~$ ?
>>A=[-1 1;3 -2]& ~9 U" |% V/ P5 _
A =
7 ~' T. j: [- c' ^   -1     1
9 T: V; ~" B1 y    3    -27 T: `* f$ A4 J9 o1 W1 [4 [
>> A > 0    %得到逻辑矩阵9 m( B+ s' v+ L! q. I  \# A
ans =' l' _: E* l3 y! W3 V5 B( k
    0     17 M, F& u/ x; B# [3 |0 F& t
    1     0+ g) o) C* f) j4 b
>> A(A > 0)   %逻辑索引,逻辑1对应的元素被选中,按列选择
- Q) W* B/ _; p2 T; Qans =
! A! ^& m: q) ?    3& r, N3 {4 p( L5 V. ]# t+ v1 R
    1
2 Y( Q3 v( G% @4 E/ S%当然,我知道你想得到的是酱紫的
+ C6 B; P" d. ?, d- |% Aans=
- m7 x2 a4 T. c% [6 n4 e& q3 g" x5 a  {    0     15 @" O: \! m( b& g% F" a
    3     0
( A% q' N" z4 \- z, i%这个可以这样得到:, O+ ?9 i& Q; B, e
>>A.*(A > 0)   %此方法就是矩阵运算的好处,可以用来取满足条件的数,不必用循环,注意是点乘
0 v: v/ e& L5 k: U  a2 t# ^# e6 b
, s8 W7 z% R" @8 r$ A# ^/ [" h. k) t6 z9 s7 C) V
另外,如果你要把矩阵中满足一定条件的数赋新值) X9 y. \; v5 m2 a$ J4 R9 I

6 w3 Z( }( A. A9 @比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
2 g8 I5 Q/ k" D8 B) v
; d2 q2 l( _. A6 X% Earray(array>1)=0;
# x, b$ p3 e8 J" L" t& J, o+ L) n" j  `4 V& d
把大于1小于3的变成0。
# v$ ^9 L5 ^9 u3 _
- C5 q4 ]$ d: X5 narray(array>1 & array<3)=0;) g! U; j( h1 b( v% J' N" e7 c

/ t9 G5 ^+ ~( K当然,还可以使用find,这个也很好用。
3 r$ r$ n' Y! a; E8 Z
# n4 t8 C6 m& T4 M; Q# \% C- p但是,当你要把矩阵中满足一定条件的数做运算时,) z! h5 o% w9 Y" Y6 h

% B, R" w$ B6 G: a8 `3 I4 z* m比如,把array数组里面大于50的数减去50,其他数不变,如果用上面的等式就不太行啦:1 b+ ^3 o$ N& W  ^" z
: L6 D- A5 c0 {. k
>>array=[51 34;57 23;45 89]
& V6 Q  e7 I" ~, z* x5 ]; Z0 K) S' K7 Parray =! m, g3 }, x- w: c  l
* b4 t1 W; ]/ b, T  G- e
    51    347 f5 X3 L7 B- y
    57    23: ]) q! `4 J* h& s8 K( V
    45    89
8 f7 ?) A. a: q! O% b' |>>array(array>50)-50
  ^0 U* U$ J) _2 C- r7 ]& r7 O- _5 g7 s( f# u( C0 a+ V, O3 z
ans =
7 |! h, Y" J- U! @  @. e     1  K4 p- A& q+ L0 d2 w. p
     7
7 Q! O4 R6 t. ~" p4 R. _0 a    39% I9 ~! D/ f& T  U5 p8 o

$ o1 A+ k5 C% L! m7 E- T" X这显然不是我们想要的结果,但是怎么会没有解决的办法呢,MATLAB这么强大,看下面
' ^8 R. t/ x7 D* u# K
. N% ]8 y, `7 d>>array(array>50)=array(array>50)-50/ f  U: [5 g+ y3 x
array =
" s' `* X1 D3 e# y    1    34) D( I( j' k, Q% q" x
    7    235 T% U" i  i5 o7 {( M
    45   39) G! v- E4 n# f3 _& |+ A& U; k" q! l, I

+ K% e$ p- x% U+ {& M这个问题在我毕设的时候也困扰了我很久,如果用循环的话,未免low了点,这个方法就很实用。
  Q+ [' c" t( b& F# {- H6 j* B0 o
* J! R+ q9 W4 P: ^( o
* @! i2 W$ M: f" n8 Z. ?* W& j, `. j* P6 |- d
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-15 18:59 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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