9/27/2006

2.7尋找非零元素

另外一個指令find則是專門找尋矩陣中元素非為零的值及行列位置。以下面之bb矩陣為例,利用find函數查尋非零元素之序號:


>> bb=[1 0 3;0 2 5;3 7 0]

bb =
1 0 3
0 2 5
3 7 0

>> find(bb)' % find the nonzero element
ans =
1 3 5 6 7 8

即表示bb矩陣中,其總序號第1、3、5、6、7、8個元素均為非零元素。若第二個參數加入,則表示該參數值為前面個數。例如:

>>find(bb,3)' % find the first 3 nonzero elements
ans =
1 3 5

表示前三項非零元素為第1、3、5項。但這種以項序指示有時不容易分辨,最好以列數與行數作為座標型態的認定。其語法則必須在指令前加三個參數,如下例:

>>x y z]=find(bb,3); % find the corespondent row & column of
>>[x y z] % the nonzero elements, z is its value
ans =
1 1 1
3 1 3
2 2 2

在find函數前置三個未知行向量[x,y,z],其內所存的x為該非零元素所在之列,y為其對應行,z為其元素值。例如第一個應在第一列第一行,其值為1。利用此一指令可以依需要各取所需。

但是有時所要找的並非僅屬於非零元素,那要怎麼辦好呢?下面例子可以解決這方面的問題:

>>find(bb>5) %find matrix elements exceeding 5
ans = 6

利用邏輯語法,可以獲得其他條件的結果。例如:要求等於零的元素項:

>>[u, v]=find(bb==0); % find elements equals to zero
[u, v]
ans =
2 1
1 2
3 3

亦即等於零的元素有三項,分別在(2,1)、(1,2)、(3,3)處,有誰能解釋為什麼上述的例子不讓它直接顯示,而另加一個矩陣表示嗎?

3 則留言:

黃世榮 提到...

同上 這樣座標會比較明顯 假使沒給他矩陣顯示 會顯示2 4 9 表示所在的第幾個位置
若遇到龐大的矩陣運算應該就會很糟糕八@@

Ching 吳子青 提到...

不讓它直接顯示,而另加一個矩陣表示因為為了讓顯示結果更清楚 如下

(A) ---不直接顯示---
>> [u,v,w]=find(bb==0);
>> [u v w]

ans =

2 1 1
1 2 1
3 3 1

(B) --- 直接顯示 ---
>> [u,v,w]=find(bb==0)

u =

2
1
3


v =

1
2
3


w =

1
1
1

結論: 可以看到case(B) 的u v w 是分開來顯示 在這裡並不方便

匿名 提到...

有類似find的語法可以找出陣列中你要的位置ㄇ??

張貼留言