10/09/2006

3.2邏輯操作元

邏輯操作元主要在連繫兩個邏輯值,應用上分為元素間、位元間等兩類。位元間讀者可自行參閱深入書籍,此處稍加介紹元素間之應用。其相關操作元如表3.2。



表3.2 邏輯操作元
操作元範例說明
&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 =
0 0 1 0 0 0 1

>>C=A¦B
C =
1 0 1 1 1 0 1

>>C=~A
C =
0 1 0 0 1 1 0

>>C=xor(A, B)
C =
1 0 0 1 1 0 0

應用時,兩矩陣必須同樣大小,除非其中一個為常數。若元素屬於非零元素(如10,8 -5等等)均視為邏輯1,或為真值。

在實際運作上,前面係直接用&~等三個符號進行邏輯運算,有些地方亦可使用函數型式,即and(A,B)代表A & B;or(A,B)代表A B;not(A)代表 ~A。

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













操作元範例說明
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矩陣找出質因數:

>>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

在這裡,isprime是尋找矩陣中元素是否為質數,而~isprime即為非質數,將其對應元素設為零即可得到質數之矩陣。這些利用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

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