(MATLAB)在三维矩阵中使用find

(MATLAB)在三维矩阵中使用find

by HPC_ZY

三维或更高维矩阵中使用find函数

find()

find()函数可以找到矩阵中满足条件的数据的索引,但它的输出最多只支持二维情况

  1. 一维情况
% 一维矩阵
A = [1,2,3,4];
% 一维返回
idx = find(A>2);
  1. 二维情况
% 二维矩阵
B = [1,3;2,4];
% 一维返回
idx = find(A>2);
% 二维返回
[x,y] = find(A>2);

因为内存本身不存在什么一维二维,只是我们通过索引构造了高维矩阵。
所以对于二维或更高维的矩阵,依旧可以使用单个返回值。
上例中idx和(x,y)只是存在一个简单的转换关系(注意MATLAB是列优先)

x = c e i l ( i d x / 2 ) , y = i d x − ( x − 1 ) ∗ 2 x = ceil(idx/2), y=idx-(x-1)*2 x=ceil(idx/2),y=idx(x1)2

高维矩阵中的find

  1. 三维情况
    有了上述理论,任意维的我们都能通过索引转换关系得到,例如三维
%% 找到满足条件的值,类似MATLAB自带的find,但这里是三维的
function [x,y,z] = find3d(mat)

[M,N,~] = size(mat);
% 一维索引
idx = find(mat);
% 索引三维转换
z = ceil(idx/M/N);
idx = idx-(z-1)*M*N;
y = ceil(idx/M);
x = idx-(y-1)*M;

end

上述代码只是为了展示原理,其实MATLAB有自带的索引转换函数ind2sub()

mat = rand(3,3,3);
% 一维索引
idx = find(mat>0.5);
% 索引转换
[x,y,z] = ind2sub(size(mat), idx);

更高维的矩阵也可以做了

其他

  1. 有更多问题,欢迎评论区留言
  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是MATLAB代码对三维空间点进行knn聚类的示例: 假设有一个3D点云数据集,存储在变量“data”,其每个点表示为一个三元组(x,y,z)。我们想将其聚类为k个集群。 1. 安装Statistics and Machine Learning Toolbox 在MATLAB,需要安装Statistics and Machine Learning Toolbox才能使用knnsearch函数。如果该工具箱未安装,请在MATLAB命令窗口输入以下内容: ``` >> ver %查看已安装的工具箱 >> matlab.addons.toolbox.installToolbox('Statistics and Machine Learning Toolbox') %安装Statistics and Machine Learning Toolbox ``` 2. 执行knn聚类 然后,我们可以使用knnsearch函数计算每个点到其最近的k个邻居的距离和索引。这些信息可以用于执行knn聚类。 ``` k = 5; %聚类数量 [idx, dist] = knnsearch(data, data, 'K', k+1); %计算每个点到其最近的k+1个邻居的距离和索引 cluster_idx = kmeans(dist(:,2:end), k); %使用K均值算法对距离矩阵的第2列到第k+1列进行聚类 ``` 在上面的代码,我们使用了K均值聚类算法对距离矩阵的第二列到第k+1列进行聚类。这是因为第一列是每个点到其自身的距离,因此不需要考虑。 3. 可视化结果 最后,我们可以将聚类结果可视化。以下代码将每个集群的点绘制为不同的颜色: ``` colors = hsv(k); %生成k个不同的颜色 figure; hold on; for i = 1:k idx_i = find(cluster_idx == i); %到属于第i个集群的点的索引 scatter3(data(idx_i,1), data(idx_i,2), data(idx_i,3), [], colors(i,:), 'filled'); %绘制属于第i个集群的点 end hold off; ``` 这将生成一个3D散点图,其每个集群的点用不同的颜色表示。 完整代码如下: ``` %生成随机3D点云数据 n = 10000; %点的数量 x = randn(n,1); y = randn(n,1); z = randn(n,1); data = [x,y,z]; %执行knn聚类 k = 5; %聚类数量 [idx, dist] = knnsearch(data, data, 'K', k+1); %计算每个点到其最近的k+1个邻居的距离和索引 cluster_idx = kmeans(dist(:,2:end), k); %使用K均值算法对距离矩阵的第2列到第k+1列进行聚类 %可视化结果 colors = hsv(k); %生成k个不同的颜色 figure; hold on; for i = 1:k idx_i = find(cluster_idx == i); %到属于第i个集群的点的索引 scatter3(data(idx_i,1), data(idx_i,2), data(idx_i,3), [], colors(i,:), 'filled'); %绘制属于第i个集群的点 end hold off; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值