2021年6月10日 星期四

邏輯操作元

 邏輯操作元

源自於http://bime-matlab.blogspot.com/2006/10/32.html

邏輯操作元主要在連繫兩個邏輯值,應用上分為元素間、位元間等兩類。

其相關操作元如下表。

邏輯操作元
操作元範例說明
&C=A&BAB兩元素均為1時為1,否則為0
C=A|B任一A或B為1為正,否則為0
~C=~A非A,即A為0時為1,否則為0
xorC=xor(A,B)僅其中一個為非零時為1,否則為0


A=[1 0 1 1 0 0 1], B=[0 0 1 0 1 0 1]
A =     1     0     1     1     0     0     1
B =     0     0     1     0     1     0     1

>> C=A & B

C =  1×7 logical array
   0   0   1   0   0   0   1

>> C=xor(A,B)
C =  1×7 logical array
   1   0   0   1   1   0   0

利用矩陣本身,進行分類的方式到處可用。這些指令函數亦常使用,
其型式如下表:

操作元範例說明
anyC=any(A,dim)A矩陣中之任何行向元素不為0時為1,否則為0。dim=2時為列向。
allC=all(A)矩陣中之任何行向元素均為1時為1,否則為0。dim=2時為列向。
isprimeC=isprime(A)A矩陣中,元素為質數時為1時為1,否則為0
isequalC= isequal(A)僅其中一個為非零時為1,否則為0
isemptyC= isempty(A)若為空矩陣為1,否則為0
isintegerC= isinteger(A)若為整數為1,否則為0
isnumericC= isnumeric(A)若為數值為1,否則為0
isrealC= isreal(A)若為實數為1,否則為0
isfiniteC= isfinite(A)若為定值為1,否則為0
logicalC= islogical(A)將矩陣A轉為邏輯值,非零為1
islogicalC= islogical(A)若為邏輯值為1,否則為0
ischarC= ischar(A)若為文字值為1,否則為0
iscellC= iscell(A)若為細胞陣列為1,否則為0
findC=find(A);C=find(A>B)找尋矩陣A中不為零之序號,存於C找尋矩陣A大於B之序號存於C

>> A=magic(3)
B=A;
B(~isprime(A))=0
A =
     8     1     6
     3     5     7
     4     9     2
B =
     0     0     0
     3     5     7
     0     0     2

這些利用is*之型式逗起來的函數也是屬於矩陣邏輯操作函數,比較常用的有isempty、isequal等等。有興趣的讀者可以參考其輔助檔。

logical則是一個將矩陣轉換為邏輯常數函數,只要零值換為邏輯0值,非零(包括負值)均視為邏輯1。例如:
>> A=-5:5
A =

-5 -4 -3 -2 -1 0 1 2 3 4 5
>> islogical(A)
ans =
0

顯然矩陣A並非邏輯矩陣,但經過如下轉換,即可轉為邏輯矩陣:
>> logical(A)
Warning: Values other than 0 or 1 converted to logical 1.
ans =
1 1 1 1 1 0 1 1 1 1 1
此外,any與 all兩函數則是檢驗一個矩陣是否有非零元素或全為非零元素。
兩者均可針對單行或單列檢驗,如:
>>any(A==B)
ans =
1 1 1

顯然它是行向作業,如改為列向則後面加一參數dim=2

>>any(A==B,2)
ans =
0
1
1

注意上述之關係等號必須使用兩個"="號。讀者可自行印證這兩個的結果。
在行向上,A與B是沒有完全相等之元素,所以下面用all指令的結果應均為零。

>>all(A==B)
ans =
0 0 0

但由於第二列均為[3 5 7],故下面的結果第二項應為1,其餘均為0。
>>all(A==B, 2)
ans =
0
1
0

有關關係操作元之運用在未來程式寫作上甚為重要。
簡潔的關係式可以使程式看起來更為流暢,其運作的時間也會降低。
最後find之函數則是尋找某矩陣不為零之元素或具某條件之原始序號,
如:
A=fix(rand(3)*10)
A =
9 8 8
9 0 0
4 3 1

>>find(A)'
ans =
1 2 3 4 6 7 9

由結果可知,第五項與第八項為零。此外:

>>find(A>5)'
ans =
1 2 4 7

其結果是:只有第一、二、四、七項元素大於五。若為矩陣間比較,其大小應相同。

沒有留言:

張貼留言

Messaging API作為替代方案

  LINE超好用功能要沒了!LINE Notify明年3月底終止服務,有什麼替代方案? LINE Notify將於2025年3月31日結束服務,官方建議改用Messaging API作為替代方案。 //CHANNEL_ACCESS_TOKEN = 'Messaging ...