Matlab 教材:搜尋向量中的數據

我們再講一個邏輯算子的基本應用,藉以讓讀者更熟悉邏輯算子。 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( ) 也可以用在矩陣上,但是現在還說不清楚,以後再說。

習題

  1. 令 v 是任意維度的序列,元素是任意的正整數。 寫一些 Matlab 指令,把 v 裡面超過 255 的元素全部置換成 255,其他的元素不變。
  2. 令 n 是任意正整數,x 是任意介於 0 與 1 之間的數, v = rand(1,n); 寫一些 Matlab 指令, 使得 v 裡面不到 x 的元素全部被置換成 x,其他元素不變。
  3. 令 v 是任意維度的序列, 寫一些 Matlab 指令,計算 v 裡面所有介於 60 和 100 之間的元素平均值 (含兩端點)。
單維彰 (2003/04/15) --- 03/04/23 (單) [Prev] [Next] [Up]