如果我正确解释了您的问题,您希望在矩阵中找出与特定 z 坐标匹配的点。如果完全匹配失败,您希望找到与所需查询最接近的 z 坐标。此外,由于您的数据存储在3 x 1088 矩阵中,您可能的意思是说每个 column 是一个坐标,而不是每一行。
我将假设第一、第二和第三行表示机器人运动的x、y 和z 坐标。第一步只是找到所需的z 坐标与矩阵中所有坐标之间的最小距离。一旦找到匹配的坐标,我们只需在矩阵中找到匹配的 z 坐标,将它们隔离出来并仅绘制 x 和 y 坐标。因此,假设您的点矩阵存储在data 中,而您的查询z 坐标存储在queryZ 中,请执行以下操作:
queryZ = 2.0; %// 1
zPoints = data(3,:); %// 2
[~,loc] = min(abs(queryZ - zPoints)); %// 3
minZ = zPoints(loc); %// 4
ind = data(3,:) == minZ; %// 5
xPoints = data(1,ind); %// 6
yPoints = data(2,ind); %// 7
plot(xPoints, yPoints, 'b.'); %// 8
title(['Points found for ' num2str(minZ)]); %// 9
第一行代码声明了一个您想要搜索的z 坐标。接下来的两行为您的数据提取z 坐标,然后使用min 并搜索z 坐标并找到最接近您所需的z 坐标的位置。我们使用这个位置来提取最近的z 坐标是什么(第 4 行),然后在您的数据矩阵中找到共享相同 z 坐标的那些位置(第 5 行)。
最后,这些位置用于过滤出数据矩阵的 x 和 y 坐标(第 6 行和第 7 行),然后我们用蓝色和点标记(第 8 行)绘制这些点。作为奖励,我们在图上放置了一个标题,显示与您的查询匹配的实际 z 坐标(第 9 行)。
编辑
鉴于您在 cmets 中的查询,您希望在每个值的特定容差范围内找到多个 z 值。最简单的方法是在for 循环中执行此操作。当然还有其他方法可以进行矢量化,但我不会花时间这样做。因此,您必须稍微修改上述公式并执行以下步骤:
- 对于每个查询点
queryZ:
- 在您的数据中找到最近的点
- 在该点的公差
tol 内搜索所有z 点
- 将这些点添加到列表中
- 对所有需要的查询点重复第 1 步
- 绘制所有这些点以供显示
因此,代码如下所示:
%// Step #1
queryZ = [2.0 1.0 -1.0 -2.0]; %// Define desired z points
tol = 0.001; %// Define tolerance here
zPoints = data(3,:); %// Extract out z points
%// Step #2
loc = false(numel(zPoints));
for idx = 1 : numel(queryZ)
z = queryZ(idx); %// Get query point
[~,minInd] = min(abs(z - zPoints)); %// Find closest point to query
minZ = zPoints(minInd);
loc(abs(minZ - zPoints) < tol) = true; %// Find indices within tolerance wrt closest point
%// Set to true
end
%// Step #3
xPoints = data(1,ind); %// 6
yPoints = data(2,ind); %// 7
plot(xPoints, yPoints, 'b.'); %// 8
第一步是不言自明的。我们首先定义一组您正在寻找的z 坐标,定义相似性容差并提取数据的z 坐标。接下来,对于我们查询集中的每个点,我们找到最接近您的数据的z 坐标,然后对于这个最接近的坐标,我们搜索在这个匹配点的指定容差范围内的点。我们使用这些位置(不是坐标)标记到一个逻辑数组中,其中true 表示该点已满足匹配标准,否则false。最后,逻辑数组中设置为true 的任何位置都意味着位于该索引处的对应点已满足与查询中至少一个点匹配的条件。
最后,我们使用这个逻辑数组来索引我们的数据,抓取所有有效点并绘制它们。
希望这会有所帮助!