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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab的计算是以矩阵为单元,有着强大的矩阵处理功能,使用时应该多用矩阵或向量运算,把循环语句转变为向量运算会省很多时间,程序也更简洁易读。) M6 s# o" c& ?. e. r/ `
! I0 [4 g5 w. r( x: ~
MATLAB中对矩阵元素的索引,包括常用的下标法和巧妙的逻辑索引,逻辑索引是用逻辑0或1去判断对应位置的元素是否被选择,所以矩阵和逻辑阵维数必须一致;是不是可能有点不明白,贴个例子你就懂啦:5 [3 |+ }7 d1 \$ Q# q# U0 }

: g0 L9 k5 N4 F% W% S( A, p# k>>A=[-1 1;3 -2]
2 a8 P! I4 u  t1 A( u  B* ^A =
! p1 T" V% ?' B( \& f5 C1 r: C   -1     1
2 y6 m+ [) g" @5 j  s    3    -2$ Y* c, L$ l) c+ d) P( k# f
>> A > 0    %得到逻辑矩阵2 K* B6 F* N3 k
ans =# C& o) j4 P  ^0 |* w" b
    0     1
% b: m. A1 x6 P8 S5 b    1     0
0 z" j4 g+ p3 Q- A/ V>> A(A > 0)   %逻辑索引,逻辑1对应的元素被选中,按列选择1 y7 \6 u* O' a
ans =, L' h9 a( p1 ?, \" s
    3) Y$ V8 d" u5 s- A- d4 a
    1: D1 C" W; j3 ~- g) S& n" W
%当然,我知道你想得到的是酱紫的
/ F8 R' z$ p+ P/ B4 c/ Lans=
% h8 ~! Y7 K9 ]! M: y8 `, R' b    0     1
( |5 J# D) ^' d    3     0
1 Y3 J# [6 P$ y( M+ y  f%这个可以这样得到:0 N6 u: k0 o3 ]; j
>>A.*(A > 0)   %此方法就是矩阵运算的好处,可以用来取满足条件的数,不必用循环,注意是点乘
  B8 _2 N# F: D- b" D" T( ^  E3 ~  m  N3 y& o

. F& q! m2 N* _% d另外,如果你要把矩阵中满足一定条件的数赋新值3 P2 ?( p( i6 G6 _+ F* R" P4 {
. ?) v8 Q/ H" N( W
比方说,一个名叫array数组里面,你要将里面大于1的都变成0,就不必用到循环:& Y) i9 h, o9 M9 {( F3 G" N& R
8 s% w% m* T4 s1 X0 f# s
array(array>1)=0;
; Z& T/ B7 k& u' G' f9 h& c2 ?, o* G. y5 C( s1 P5 h! @
把大于1小于3的变成0。
$ p6 G+ V' a/ E8 [7 ^; V
5 S' u/ H3 c7 Zarray(array>1 & array<3)=0;: m* d- d9 V0 L
3 v/ m& s, k4 l' ?. E+ J! I3 n
当然,还可以使用find,这个也很好用。$ `0 W( {' y! g7 k0 f- H6 A# u% \2 _

3 {5 d0 f9 z6 A, p( a2 l3 m  T但是,当你要把矩阵中满足一定条件的数做运算时,( B3 f" F+ X$ C: n6 z9 R

8 l, r$ b  G' E比如,把array数组里面大于50的数减去50,其他数不变,如果用上面的等式就不太行啦:
& q) ]6 E, S' E' v
3 S9 v2 n2 V# F5 `/ I >>array=[51 34;57 23;45 89], t1 T  O+ P( _
array =
0 s  f6 z. T% z- o: h/ D7 c' a7 I* \7 {
    51    341 K  f2 M, [2 G8 w! [7 l
    57    235 x/ w& X5 a& P2 r- p" O
    45    899 q6 V# E8 `1 g1 T7 g0 p
>>array(array>50)-50
4 F1 ?8 J) ?8 P+ `0 ]" P; i7 x
, l2 P: {- [$ O' X5 x) rans =
9 ~8 H2 T& ?& f1 H  K. w     10 Q+ F5 Y9 B( n' S$ S% m! W" E8 ~2 k8 y
     7
4 B  D* B: H" Z& ~$ |8 o4 [. [+ r    39  ~8 w' L- Z8 L; k, Z

! s) D1 W2 y6 p1 c6 f9 w0 b这显然不是我们想要的结果,但是怎么会没有解决的办法呢,MATLAB这么强大,看下面
5 d" W( a2 P; _( w6 M' l4 y
( ~; O& \  k! M% p) D+ t/ q# j/ J>>array(array>50)=array(array>50)-50
' N8 H; \  d$ t* E  c% Narray =
" o& l/ D! J2 M5 g6 e- @    1    34
: Q" }! l- q# l! W* D! Z$ Y$ J    7    23
/ I/ F7 m( P3 M# g( F6 l. @1 ~; [    45   39
" O$ M' x" M# C& H9 [) g$ h4 ^8 X1 x: J* @# j
这个问题在我毕设的时候也困扰了我很久,如果用循环的话,未免low了点,这个方法就很实用。
1 `" V, a) L$ G
7 O/ l9 x. m2 P$ ^; Y/ F( Q1 p  m. t7 H8 c
; R, w0 {! ^: x" Q
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 00:24 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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