1. 程式人生 > 其它 >matlab中.*和*的區別_1.基礎知識(5) Matlab中特殊符號使用總結

matlab中.*和*的區別_1.基礎知識(5) Matlab中特殊符號使用總結

技術標籤:matlab中.*和*的區別matlab矩陣維度必須一致matlab索引超出矩陣維度

前言:上篇文章分享了Matlab經常會遇到(),[],與{}三種符號,下面接著捋一捋其他的特殊符號使用方法6db30ba844eb67eaf7ebd939373ab43d.png,主要有

冒號
'分號
& &&
| ||
~
.

97ad4382024c4bdf4bea65dde3b366ae.png


1、:冒號

冒號的主要用途是用來表示資料從開始位置取到/生成到截止位置,例如:

>>x=1:4%生成1到4的資料x =     1     2     3     4>>x(2:3)%提取x中2到3位置的資料ans =     2     3

x(i,j,k)的含義是第k層矩陣的第i行第j列元素,x(:,:,1)則表示第1層矩陣,比如:建立多維陣列

A = [1 2 3; 4 5 6; 7 8 9]A(:,:,2) = [10 11 12;13 14 15;16 17 18]A(:,:,1) =     1     2     3     4     5     6     7     8     9A(:,:,2) =    10    11    12    13    14    15    16    17    18A(:,1,1)ans =     1     4     7

y=x(1,:),把x這個矩陣的第一行所有列賦給y。

注:冒號相當於所有。

在matlab中,a(:, 1:3)=[]表示將陣列a的第1到第3列刪除。

第一個冒號( : )表示取陣列a的所有行;1:3表示取陣列a的第1到第3列。


2:'分號

分號一般用於矩陣轉置,其中A.'是一般轉置,A'是共軛轉置,顧名思義是對矩陣先做共軛運算(不懂共軛的自行百度d7902235ad6a62e088383118f65a3873.png),再進行轉置,在A是實數矩陣時,兩者沒有區別,但是當A是復矩陣時,就有區別,示例如下:

A=[1 2 3;4 5 6]A =1 2 34 5 6>>A.'ans =1 42 53 6>> A'ans =1 42 53 6>> a=[1+i 2+2i 3+3i;4+4i 5+5i 6+6i]a =1.0000 + 1.0000i 2.0000 + 2.0000i 3.0000 + 3.0000i4.0000 + 4.0000i 5.0000 + 5.0000i 6.0000 + 6.0000i>> a.'ans =1.0000 + 1.0000i 4.0000 + 4.0000i2.0000 + 2.0000i 5.0000 + 5.0000i3.0000 + 3.0000i 6.0000 + 6.0000i>> a'ans =1.0000 - 1.0000i 4.0000 - 4.0000i2.0000 - 2.0000i 5.0000 - 5.0000i3.0000 - 3.0000i 6.0000 - 6.0000i

另外補充一個conj(a)是求a的共軛矩陣,示例如下:

conj(a)ans =1.0000 - 1.0000i 2.0000 - 2.0000i 3.0000 - 3.0000i4.0000 - 4.0000i 5.0000 - 5.0000i 6.0000 - 6.0000i

也就是說

a.' = conj(a)'

啟發思考

問:matlab中a(: ).'是什麼意思?

答:a(:)作用是把矩陣a轉換為列向量,就是一列,a(: ).'是把矩陣a轉換為一個行向量,就是一行。

a(: ).'ans =  列 1 至 4   1.0000 + 1.0000i   4.0000 + 4.0000i   2.0000 + 2.0000i   5.0000 + 5.0000i  列 5 至 6   3.0000 + 3.0000i   6.0000 + 6.0000i

3、邏輯運算

3.1、"&&"與"&"

A&B

(1)首先判斷A的邏輯值,然後判斷B的值,然後進行邏輯與的計算。

(2)A和B可以為矩陣(e.g. A=[1 0],B=[0 0])。

A&&B

(1)首先判斷A的邏輯值,如果A的值為假,就可以判斷整個表示式的值為假,就不需要再判斷B的值。

(2)A和B不能是矩陣,只能是標量。

>> a = [1 0]a =     1     0>> b = [2 3]b =     2     3>> a & bans =  1×2 logical 陣列   1   0>> a && b報錯提示:|| 和 && 運算子的運算元必須能夠轉換為邏輯標量值。>> c1 = 0c1 =     0>> c2 = 1c2 =     1>> c1 & c2ans =  logical   0>> c2 = 3c2 =     3>> c1 = 3c1 =     3>> c1 & c2ans =  logical   1

A&&B 首先判斷A的邏輯值,如果A的值為假,就可以判斷整個表示式的值為假,就不需要再判斷B的值。這種用法非常有用,如果A是一個計算量較小的函式,B是一個計算量較大的函式,那麼首先判斷A對減少計算量是有好處的。另外這也可以防止類似被0除的錯誤:

flag=denum~=0 && num/denum>10

if flag

%Do Something

end if

上面的表示式就可以防止denum等於0的情況。當然,如果你希望在判斷的時候,對A和B表示式都進行計算,就應該使用標準的&或者|。Matlab中的if和while語句中的邏輯與和邏輯或都是預設使用short-circuit形式。

if flag=denum~=0 && num/denum>10

%Do Something

end if

if flag=denum~=0 & num/denum>10

%Do Something

end if

3.2、"||"與"|"

"||"與"|"的使用同"&&"與"&"

3.3、~

非(或邏輯非)是一元操作符,即~A:當A是非零時結果為“0”;當A為“0”時,結果為“1”.因此下列兩種表示:

p | (~p) 結果為1

p & (~p) 結果為0

>> p = 1p =     1>> ~pans =  logical   0>> p = 2p =     2>> ~pans =  logical   0>> p = 0p =     0>> ~pans =  logical   1

額外小tips:

any和all函式在連線操作時很有用,設x是0-1向量,如果x中任意有一元素非零時,any(x)返回“1”,否則返回“0”;all(x)函式當x的所有元素非零時,返回“1”,否則也返回“0”.這些函式在if語句中經常被用到.如:

if all(A<7)dosomethingend

這種方式經常用來判斷陣列的資料是否滿足特定要求。


4、.點

.點在matlab中主要用於矩陣元素計算,例如:乘是代表兩個矩陣相乘,只要符合矩陣相乘的規則即可,而點乘對應的是矩陣中元素的相乘,在最新的Matlab上,不要求兩個矩陣的維度一定要相同,老點的版本可能會報錯,提示矩陣維度不相同。

A = [1 2 3;4 5 6;7 8 9]B=[1;2;3]C=A*BC =    14    32    50

老版本:

C=A.*B

錯誤使用 .*

矩陣維度必須一致

新版本:

C=A.*BC =     1     2     3     8    10    12    21    24    27
A=[1 2 3;4 5 6;7 8 9];B=[1 1 1;2 2 2;3 3 3];C=A.*BC =     1     2     381012    21    24    27

也就是說新版本的A.*B在矩陣非同維度的情況下,Matlab會自動補齊維度

上文連結:1.基礎知識(4) --Matlab中(),[],與{}的區別