find函數文法如下,我們着重讨論下傳回值的問題,并對二維以上數組進行查找
1.k = find(X)
2.k = find(X,n)
3.k = find(X,n,direction)
4.[row,col] = find(___)
5.[row,col,v] = find(___)
一、前三個文法傳回的是一個線性索引k,如果x是多元數組,則按照第一維,第二維,第三維的順序周遊(三維以上以此類推)。 例如2x2x2的三維數組,第一維我們稱之為行,第二維為列,第三維為頁。則第一行第一列第一頁為1,第一行第二列第一頁為3,第一行第一列第二頁為5。
例子:X為m*n*z=2*4*2的數組(假設a為非零元素)
val(:,:,1) =
1 0 0 1
1 1 0 1
val(:,:,2) =
0 2 0 2
0 2 2 2
k=find(a)=[1 2 4 7 8 11 12 14 15 16]
fix((k-1)/(m*n))+1則得到頁索引
fix(rem(k-1),(m*n))/m)+1便得到列索引
rem(rem((k-1),m*n),m)+1便得到行索引
二、第4個文法傳回的是行和列索引,對于三維數組,row始終是實際對應的行,col則是從第一頁開始順序周遊,例如2x2x2數組,第一行第一列第一頁為[1 1],第一行第一列第二頁為[1 3]。三維以上則按照第三維第四維的順序依次周遊。
例2:
例子:X為m*n*z=2*4*2的數組,元素值:
val(:,:,1) =
1 0 0 1
1 1 0 1
val(:,:,2) =
0 2 0 2
0 2 2 2
[row col]=find(a)
row=[ 1 2 2 1 2 1 2 2 1 2]
col=[ 1 1 2 4 4 6 6 7 8 8]
fix((col-1)/n)+1便為頁索引
rem((col-1),n)+1便為列索引
三、第5個文法在前面的基礎多了個v,傳回對應的索引的數值
---------------------------------------------------------------------------------------------------------------------------------
ps:最近在做圖像處理方面涉及到多元數組,對最近的使用做個總結。matlab的這個處理機制可能由于多元數組在記憶體裡的存儲機制有關,是以周遊的時候都是按照第一維第二維....的順序依次進行。