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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab的计算是以矩阵为单元,有着强大的矩阵处理功能,使用时应该多用矩阵或向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。
- s' R9 O3 q& e$ J
8 W- ]8 \1 ~% RMATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑0或1去判断对应位置的元素是否被选择,所以矩阵和逻辑阵维数必须一致;是不是可能有点不明白,贴个例子你就懂啦:$ q* P- X$ [: X9 d$ X

8 ]; Y& C4 g, s* C* l% q>>A=[-1 1;3 -2]
! ~% A7 y4 Q( {; @A =
. B! X3 ~4 n8 o3 Y   -1     1
& F. O* X' P& _. T% Z    3    -2* p; o- ~' d) p  D9 {  i, Y- l
>> A > 0    %得到逻辑矩阵: N1 ~+ E3 ~7 x0 I
ans =
4 p0 w- {2 n! {* g1 o' \3 [. u4 @    0     1
$ b8 b) F3 c9 a( _% R% p    1     0* Y4 C# W2 q8 U8 o
>> A(A > 0)   %逻辑索引,逻辑1对应的元素被选中,按列选择
4 m' I+ p6 f; ]ans =9 Q; D2 X+ B- B& \/ x
    3
1 \; u: a2 c' o    17 |% i5 n; t6 p2 @
%当然,我知道你想得到的是酱紫的
/ ^' O6 X7 w8 ^  O4 Uans=
) J: \" g; i' ~, ]7 r& F    0     1
3 X: k2 g% N6 H: [    3     0+ x, t8 e% ^# U. c' X+ o; ~
%这个可以这样得到:
% M0 o# J+ T- b# A! u0 l>>A.*(A > 0)   %此方法就是矩阵运算的好处,可以用来取满足条件的数,不必用循环,注意是点乘7 k( |* U; X- C4 {' p8 L: k
! O) _& F! y, Y# {5 L

7 ^& @5 `8 Q. ]2 v: |: ]6 H, K另外,如果你要把矩阵中满足一定条件的数赋新值7 r: P4 r( p; n" v& s
( U' a( {  Y3 w1 J
比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
! U- G, z( s8 x. q% Q- ?8 w% e5 v$ U# X" i! q1 R
array(array>1)=0;
# C9 `9 N* R& E  V3 H+ [3 K4 W
* |' H# T. \5 K8 g' ~0 l) d8 ^5 g把大于1小于3的变成0。
# o& M+ Q& Y: F% G2 f
9 U3 K; _8 a& v( H4 ~! S1 ^4 h& m% Barray(array>1 & array<3)=0;
# k+ z$ m, Q$ V4 c0 S3 J
+ v0 J& e! f% F. }# ?; Q当然,还可以使用find,这个也很好用。
/ j/ I" _' i% h; t3 f5 z- m# M; y) o1 f" I
但是,当你要把矩阵中满足一定条件的数做运算时,
0 K6 ^( X: U% [' c# p4 t+ u! E  Y  S5 z* R7 T$ [: l$ o' T
比如,把array数组里面大于50的数减去50,其他数不变,如果用上面的等式就不太行啦:
' N0 `! ^9 W# U8 R9 ^3 V$ |& a. S" D+ G
>>array=[51 34;57 23;45 89]4 t8 M3 L7 A! {: @' ~& {+ m  r( h
array =
/ M* m' c: w" y- h8 d
8 C% }4 |( Q" I    51    34+ ]9 o  T# p; F% ~
    57    23
$ \0 X7 U; i1 s& U2 \, |7 V, a    45    89' R* |- _% x6 J$ k& j3 v- D, A1 |! @
>>array(array>50)-50! j& H& D3 Z/ H, Y1 e4 p

, d; N5 B  m3 Tans =0 W7 _1 @! q. z# \* }
     1$ L3 i( N3 A: ^, @  `9 g
     7
; n0 U8 s5 n9 z. Z! q    39
+ z  J3 k" G, v; o4 j
" o- x/ {6 o# f* c' O# G. D这显然不是我们想要的结果,但是怎么会没有解决的办法呢,MATLAB这么强大,看下面
& O4 G! B2 _, L, C# \! P$ J" G; w0 _# q  P5 W, f* e
>>array(array>50)=array(array>50)-50
" h  E& ~( F- C6 {4 Uarray =/ `# J9 Q3 q8 S' K* `; Y" n- z$ E
    1    34
4 L- W7 h, z) Z' h( r    7    237 M% [: e$ U, f( |
    45   39
) Q6 ~5 {) S( E) A2 q
+ p; B4 j# b  U8 H0 |* {6 a这个问题在我毕设的时候也困扰了我很久,如果用循环的话,未免low了点,这个方法就很实用。
3 Z6 Y$ B; [- p4 T) j: Q. L& Z- p+ v8 c: `5 V1 s/ d
' P$ E5 Y( \- N
: c2 K1 d6 n/ C3 e
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-14 04:58 , Processed in 0.062500 second(s), 23 queries , Gzip On.

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

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

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