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 d
MATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑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 @' t
A =
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 b
ans =
) f( M+ J! g" x/ F# G$ T
0 1
9 |8 M0 O! b+ v* N. }' z
1 0
2 _% R2 L4 Q* g
>> A(A > 0) %逻辑索引,逻辑1对应的元素被选中,按列选择
6 x `) S) y5 e( l
ans =
+ 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. y
array(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 v
array =
. [. 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# [; W
2 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)-50
2 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) [) X
9 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