EDA365电子论坛网

标题: 学习一下MATLAB中矩阵的逻辑索引方法 [打印本页]

作者: ulppknot    时间: 2019-12-26 10:04
标题: 学习一下MATLAB中矩阵的逻辑索引方法
Matlab的计算是以矩阵为单元,有着强大的矩阵处理功能,使用时应该多用矩阵或向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。7 K# I0 E( }- ?3 j0 U: |0 ~% Y

3 c& R! L5 H1 W4 dMATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑0或1去判断对应位置的元素是否被选择,所以矩阵和逻辑阵维数必须一致;是不是可能有点不明白,贴个例子你就懂啦:
# e, j3 J+ A2 Q+ X4 S
! z- B; h1 A& w. I9 V% }! B>>A=[-1 1;3 -2]
5 T0 M1 s" t& G0 p! |: q( p6 @' tA =0 t$ b  h' @3 c
   -1     1
) o& i+ b' r5 `* Z2 h0 J    3    -2
- x6 ]( D6 D, {5 F>> A > 0    %得到逻辑矩阵
! y4 C) }5 [7 p2 q) D4 bans =) f( M+ J! g" x/ F# G$ T
    0     19 |8 M0 O! b+ v* N. }' z
    1     0
2 _% R2 L4 Q* g>> A(A > 0)   %逻辑索引,逻辑1对应的元素被选中,按列选择
6 x  `) S) y5 e( lans =+ x: i' H5 [  D1 @" E7 [' ^
    3. ~' x# x: Q5 ~, d* c' K
    1. K: G: x. w$ C) W4 G7 K7 R# e
%当然,我知道你想得到的是酱紫的$ O" F/ v( Q1 M8 r: m
ans=
& f( I6 @0 l! `/ F7 s8 ~8 X    0     1* n! z3 s' e2 w- i2 E
    3     0% d: o  r: k+ p# ~
%这个可以这样得到:$ m% r! A1 i4 B* t0 i
>>A.*(A > 0)   %此方法就是矩阵运算的好处,可以用来取满足条件的数,不必用循环,注意是点乘
" H5 [3 C' ~% ~/ {3 p( s
- [  [5 M# g6 R# }3 w
- L, u& c4 ]8 a9 R7 k& Y另外,如果你要把矩阵中满足一定条件的数赋新值' P0 v8 b1 e7 T' t+ o
" R: u, E* W% j) o5 q# u) F, h
比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
: x. I; p0 K  G! I9 n9 e/ |  m- y) j: Q: h/ t
array(array>1)=0;
* K% @# s  p3 L, p: Y8 x8 ?; o
7 [1 }7 P& l* y$ N9 ]7 N把大于1小于3的变成0。
$ f4 F# }7 n* r. `7 P* D
3 L3 }' |" V- _. M' w. yarray(array>1 & array<3)=0;' ]( G/ y+ y5 z0 u8 |, l

% n: V+ U5 z: r! ^) @当然,还可以使用find,这个也很好用。
: `8 T6 s& H5 C. Q# b. h
) J- m- J; L7 p( v0 Q# ]2 `但是,当你要把矩阵中满足一定条件的数做运算时,
, ~$ g3 Z1 l5 X9 t- }+ z$ h' n) a( I; b* _) g' |: ], j
比如,把array数组里面大于50的数减去50,其他数不变,如果用上面的等式就不太行啦:3 z! A: @9 d6 k2 D& }. w( @

, }" o& \6 N0 {7 A$ [ >>array=[51 34;57 23;45 89]
& N+ Q% j( E& I: ?* K* Y4 \6 varray =
. [. c4 \: M+ X# ~0 j3 c- P
" d  x) e' A! v/ ~4 z0 I* D% Z3 I" k    51    34
& L/ s, J# _+ g" a+ z& d% ?    57    23
  L7 \  u% Y4 @$ k) b# ?1 u    45    89
* g1 Z: B, `! C" g$ Y>>array(array>50)-50
/ O' j) J% X# [; W2 L6 Y  a0 L- J
ans =& O  @" d5 C+ f% H6 v
     1
+ P; Y8 P, u  y3 I     7
. q+ T4 f2 ?* I- _    39
" D1 `1 Z  C" K7 `, m' P2 d" s# E, `' a
; o0 X$ k6 \) X7 P  [7 Z这显然不是我们想要的结果,但是怎么会没有解决的办法呢,MATLAB这么强大,看下面; K) t5 ?  Y& L4 t" z% w$ r* {
& \5 |3 T7 F6 V% |7 s2 n7 X
>>array(array>50)=array(array>50)-502 w3 E8 O- @$ D$ V2 ?- F' R3 Q
array =
7 K/ F: A! |. s. S& t9 B    1    34
  a4 M# x, x% T3 N    7    23
6 E- W) P7 y+ c    45   39
. I5 U. L) _; h$ S- e5 C, Z* Y+ ^  [! D, u+ `1 P# I# S
这个问题在我毕设的时候也困扰了我很久,如果用循环的话,未免low了点,这个方法就很实用。
! `: [# X; x3 c" P1 Z
$ m2 ]: Z" p) [) X9 P2 E% |) j; J! R4 q4 r

/ G! `: W4 I& b3 k$ ^/ p
作者: xixihahaheihei    时间: 2019-12-26 18:36
谢谢分享




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2