我們再講一個邏輯算子的基本應用,藉以讓讀者更熟悉邏輯算子。 Matlab 有一個「搜尋」函式, 專門用來把向量內符合某個邏輯條件的元素都找出來。 假設以下序列是一個班級的學期成績:
v = [59 92 40 12 85 54 57 49 80 61 82 57]如果我們定義「高標準」就是所有成績超過平均值的平均成績, 以下敘述一個求高標準的 Matlab 流程。
首先,我們需要平均值,這個已經會了:
m = mean(v)然後我們要設法把 >= m 的成績找出來。用
index = find(v >= m)得到的 index 序列是 [2 5 9 10 11], 這些正整數就是 v 中 >= m 的元素足標。 也就是說,v(2), v(5), v(9), v(10), v(11) 就是超過 m 的成績。
在 [向量的合成] 裡面, 我們學到 Matlab 提供一個好辦法,把 v(2), v(5), v(9), v(10), v(11) 取出來:
v(index)試試看,看到了嗎?得到的序列就是 [92 85 80 61 82]。 我們只要計算這個新序列的平均,就是高標準了。也就是說
mean( v(index) )即為所求,答案是 80。
仔細想想,我們其實不需要經過 index 這個中間變數,直接把三個函式套在一起就行了:
mean( v( find(v>=m) ) )再仔細想想,好像 m 也不需要,可以寫得更精彩:
mean( v( find( v>=mean(v) ) ) )答案當然還是 80。
其實,前一節所談「把 55 至 59 分的成績調整為 60 分」的問題, 也可以用 find( ) 解決,以下是一套作法。不知道讀者覺得哪個作法比較直觀?
首先,找出將要被加分的成績足標:
index = find( (v <= 59) & (v >= 55) )得到 index = [1 7 12],共有三個成績要調整為 60 分。 所以就用以下指令直接把它們設定為 60:
v(index) = [60 60 60]這個手法不錯,但是還要自己數數,太麻煩。怎樣更自動化呢? 可以用 length(index) 得知共有幾個元素要變成 60,然後用
60 * ones(1, length(index))製造出來 [60 60 60] 這個序列。因此,自動化的指令就是
v(index) = 60 * ones(1, length(index))
find( ) 也可以用在矩陣上,但是現在還說不清楚,以後再說。
習題