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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab的计算是以矩阵为单元,有着强大的矩阵处理功能,使用时应该多用矩阵或向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。
& ?& {1 P6 k6 X+ c6 W, k; A6 V  `8 `: i) [& a4 W0 F) u- w
MATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑0或1去判断对应位置的元素是否被选择,所以矩阵和逻辑阵维数必须一致;是不是可能有点不明白,贴个例子你就懂啦:
1 g) ~- S, h) Y9 Z$ X" A
% ^0 G; c3 K4 n- M>>A=[-1 1;3 -2]
/ ]' }: P9 I3 R, W6 KA =
4 K2 u3 d4 a9 e% G   -1     1
0 S$ n5 f' e5 C. m8 h    3    -2
8 Y9 ?! B  Y- f% V' @>> A > 0    %得到逻辑矩阵
2 n* ^9 {" Y) z2 v8 z9 a1 {, Bans =
! f& I. {4 P( F$ g) D8 E; q    0     18 A/ H+ x: ~/ u* ]
    1     0  W4 I5 A/ ~8 ?  s5 l# P6 @
>> A(A > 0)   %逻辑索引,逻辑1对应的元素被选中,按列选择
& [3 V9 J$ ?; n* L; q0 y; }$ Oans =# A- \4 J6 l/ o& ]) \& B1 w. c
    3
( X, X  z  ]: h& E( d+ h    15 P9 v) u0 a: d, I( y- _
%当然,我知道你想得到的是酱紫的
6 D6 ?. s; i& E! c- N6 G+ xans=
: q( }* {' y$ z: a    0     1+ |+ Y" @# I/ o) Y* L
    3     0' `1 ^$ v, _/ K) b9 s8 W+ B: E' w. p
%这个可以这样得到:6 W5 R4 W' d: r' Z: S
>>A.*(A > 0)   %此方法就是矩阵运算的好处,可以用来取满足条件的数,不必用循环,注意是点乘) q  p. s! Z% {5 R

9 j" C7 n/ l: [2 g. G2 W, a. Z% e) R; F3 _
另外,如果你要把矩阵中满足一定条件的数赋新值: z$ z+ n% j8 B1 f1 w

' @- |. q% `1 Q5 w# H5 @比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:
" N. T% p- ?  r3 z% \' O7 |0 O, P9 |1 r8 f; S+ k
array(array>1)=0;  H# o) s0 J' Z$ ]/ k: \

5 t5 J0 p# h8 F7 Q把大于1小于3的变成0。
2 G5 M0 Y# D( v5 B( U) l# N4 e  p7 ?1 F
array(array>1 & array<3)=0;" [3 R) p# \( T) n

. F. u1 l: A6 T6 ?4 V; Q. r0 |当然,还可以使用find,这个也很好用。
; C" a7 K' z' [$ ^. w9 Q
0 ?% ^. W& B" C4 J! w但是,当你要把矩阵中满足一定条件的数做运算时,
" R; ^: K' Z1 N6 e
) C1 ~5 w6 |$ Y8 p8 D' k比如,把array数组里面大于50的数减去50,其他数不变,如果用上面的等式就不太行啦:
; z2 h' s4 ]7 R4 U
, g: j) ~, y8 `4 z6 T >>array=[51 34;57 23;45 89]
6 s- f4 z. k* I6 z( K- y: V% }array =7 V* U% Z7 l5 P0 L8 H

7 u' I3 Y) s; D+ {, s    51    34
7 o9 X( }- e: ]: z# V    57    237 J( v: s. J# h) O- e
    45    890 H2 I# x( d9 q, u& a' \! v( ?3 x5 P
>>array(array>50)-50
/ N( J4 z3 P: G  A  Z# K1 U' L/ K, `' i/ u9 ?0 \
ans =
8 @7 K$ ]6 X" {! G     1, G  ~" X0 x- Z( S5 a
     7
, ?0 \# J% ^# `- |6 i' y  ^2 s    39
/ o! b8 b) |2 R1 _! A: N7 P5 t2 G4 l4 G5 D' l9 u. j
这显然不是我们想要的结果,但是怎么会没有解决的办法呢,MATLAB这么强大,看下面
3 F7 i) M- F6 l  B# L+ n4 K
5 W- Z) x' J6 q& i>>array(array>50)=array(array>50)-50
* U" I$ M* _+ o) Q- harray =  y! w; b3 y4 @. n$ {6 O
    1    34$ Y/ r0 h7 Y: S4 ]: l$ R
    7    23
7 g3 b# X9 d% H: }$ H( a    45   39) f8 Q; K$ e0 G2 C

8 a. T. j- f0 c/ s* ]2 |9 e+ z这个问题在我毕设的时候也困扰了我很久,如果用循环的话,未免low了点,这个方法就很实用。% t  [0 q+ `  y3 g8 j( G5 _

' u6 {& {1 i% O9 P" j
& I4 |9 R7 s" E& g: T
: U* ^0 z: D7 ]( C& y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-12 22:54 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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