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的这个处理机制可能由于多维数组在内存里的存储机制有关,所以遍历的时候都是按照第一维第二维....的顺序依次进行。