3.2邏輯操作元
邏輯操作元主要在連繫兩個邏輯值,應用上分為元素間、位元間等兩類。位元間讀者可自行參閱深入書籍,此處稍加介紹元素間之應用。其相關操作元如表3.2。
操作元 | 範例 | 說明 |
---|---|---|
& | C=A&B | AB兩元素均為1時為1,否則為0 |
| | C=A|B | 任一A或B為1為正,否則為0 |
~ | C=~A | 非A,即A為0時為1,否則為0 |
xor | C=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。
利用矩陣本身,進行分類的方式到處可用。這些指令函數亦常使用,其型式如下表:
操作元 | 範例 | 說明 |
---|---|---|
any | C=any(A,dim) | A矩陣中之任何行向元素不為0時為1,否則為0。dim=2時為列向。 |
all | C=all(A) | 矩陣中之任何行向元素均為1時為1,否則為0。dim=2時為列向。 |
isprime | C=isprime(A) | A矩陣中,元素為質素時為1時為1,否則為0 |
isequal | C= isequal(A) | 僅其中一個為非零時為1,否則為0 |
isempty | C= isempty(A) | 若為空矩陣為1,否則為0 |
isinteger | C= isinteger(A) | 若為整數為1,否則為0 |
isnumeric | C= isnumeric(A) | 若為數值為1,否則為0 |
isreal | C= isreal(A) | 若為實數為1,否則為0 |
isfinite | C= isfinite(A) | 若為定值為1,否則為0 |
logical | C= islogical(A) | 將矩陣A轉為邏輯值,非零為1 |
islogical | C= islogical(A) | 若為邏輯值為1,否則為0 |
ischar | C= ischar(A) | 若為文字值為1,否則為0 |
iscell | C= iscell(A) | 若為細胞陣列為1,否則為0 |
find | C=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
其結果是:只有第一、二、四、七項元素大於五。若為矩陣間比較,其大小應相同。
沒有留言:
張貼留言