Matlab关于find()函数的心得,查找三维数组

本文详细解析了MATLAB中find函数的多种用法及其返回值的特点。包括如何在一维、多维数组中查找非零元素,并获取其线性索引、行索引、列索引及对应的值。同时介绍了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的这个处理机制可能由于多维数组在内存里的存储机制有关,所以遍历的时候都是按照第一维第二维....的顺序依次进行。

### 使用 MATLAB三维数组绘制成三维图像 为了在 MATLAB 中将三维数组转换成可视化的三维图像,可以根据具体需求选择不同的可视化方法。对于三维据集来说,常用的有 `slice` 函数用于创建切片平面视图、`isosurface` 函数来提取等值面以及 `scatter3` 或者 `plot3` 来展示离散点或路径。 #### 方法一:使用 slice 进行体绘制 当希望查看整个体积内部结构时,可以采用 `slice` 命令显示不同位置上的截面情况: ```matlab % 创建示例三维数组 [X,Y,Z] = meshgrid(-2:.2:2); V = X.*exp(-X.^2-Y.^2-Z.^2); % 定义切割平面的位置 xslice = [-1.5,0]; yslice = []; zslice = []; figure; slice(X,Y,Z,V,xslice,yslice,zslice) xlabel('x-axis') ylabel('y-axis') zlabel('z-axis') title('Slice Plot of Volume Data') colorbar ``` 此代码片段展示了如何利用 `meshgrid` 构建规则网格并填充相应的强度值 V 形成一个简单的高斯分布作为例子[^2]。 #### 方法二:使用 isosurface 提取表面模型 如果更关注特定密度水平处形成的封闭曲面,则可借助于 `isosurface` 实现这一目标: ```matlab fv = isosurface(V,.02); % .02 表示设定的阈值 p = patch(fv,'FaceColor','red','EdgeColor','none'); isonormals(V,p) view(3) camlight lighting gouraud axis equal tight box on daspect([1 1 1]) colormap(gray) title('Isosurface Plot with Threshold Value') ``` 这段脚本说明了怎样基于给定的据集 V 和指定的 iso-value (.02),构建出该条件下的立体形状,并对其进行渲染处理以增强视觉效果[^4]。 #### 方法三:通过 scatter3 显示离散样本点 针对那些稀疏分布在空间内的测量结果或者是模拟得到的小规模实体集合,可以直接调用 `scatter3` 展现出它们的空间布局特征: ```matlab [xs, ys, zs] = ind2sub(size(data), find(~isnan(data))); % data 是输入的三维数组 colors = reshape(data(:)', [], 1); figure; scatter3(xs(:), ys(:), zs(:), 8, colors, 'filled'); % 字8控制标记大小 xlabel('Dimension 1'), ylabel('Dimension 2'), zlabel('Dimension 3') title('Scatter Plot Showing Non-NaN Elements in a 3D Array') colorbar ``` 上述程序解释了从原始三维矩阵中筛选有效元素及其对应坐标的过程,接着把这些信息传递给 `scatter3` 来完成最终作图工作[^3]。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

blanklog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值