天天看點

Matlab關于find()函數的心得,查找三維數組

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的這個處理機制可能由于多元數組在記憶體裡的存儲機制有關,是以周遊的時候都是按照第一維第二維....的順序依次進行。

繼續閱讀