【问题标题】:MATLAB: Does there exist a smart way to remove adjacent (x,y) points stored in some array?MATLAB:是否存在删除存储在某个数组中的相邻 (x,y) 点的智能方法?
【发布时间】:2020-02-18 23:48:53
【问题描述】:

有吗?我正在专门考虑一些矩阵数组,其中行对应于 x 和 y 坐标,例如

4 3
4 5
5 4
3 4
4 4

使得 (4,3) 和 (4,5) 等是 (x,y) 点。问题是这样的:如果列表中的一个点被列表中的其他点相邻包围,例如

(~,~) (4,5) (~,~)
(3,4) (4,4) (5,4)
(~,~) (4,3) (~,~)

就像上面的列表一样,那么我想以某种有效的方式将其删除。如果在某个点上满足这一点,很容易直观地看到,但是我如何在代码中做到这一点?我只是在寻找一些建议,所以如果有人以前遇到过这个问题或有一些意见,我会很感激阅读!

最好的问候,

【问题讨论】:

  • 您的问题不清楚。您尝试了什么,为什么不是“高效”或“智能”? (笼统的术语)。您的数据是双倍的还是 uint8?阵列有多大?等等……
  • 您要删除哪些点?只有点完全被点包围?如果两个相邻点都被点包围,而您删除其中的第一个,则第二个不再被包围。是否仍要删除它?
  • 好吧,我在想的是设置一个由 1 和 0 组成的矩阵,表示我的网格中的哪些点被占用,然后从那里查看每个 (x,y) 点是否有相邻的 nejghbors .但是对于我的目的来说,通过这样的矩阵似乎很昂贵。我正在模拟一场森林火灾,(x,y)点列表代表着火的所有位置。然后我遍历列表以产生更多的火灾,但随着时间的推移,其中一些位置变得不必要(它们不再影响结果)。
  • 如果你有一个二进制矩阵M,那么你可以使用2D卷积来检测连接的非零值:M(conv2(M,[0 1 0; 1 0 1; 0 1 0],'same')>0) = 0
  • 这仍然不能回答为什么您认为 0 和 1 的矩阵效率低下。我很确定无论是完整矩阵还是稀疏矩阵都比您当前存储数据的方式更有效。

标签: arrays matlab sorting


【解决方案1】:

我不确定您是否可以避免在这里循环(不确定这是否就是您所说的高效......)。至少我没有想出一个没有循环的解决方案,但应该这样做。

vec = [4 3; 4 5; 5 4; 3 4; 4 4; 6 7; 6 8; 6 6; 5 7; 7 7];
for i = 1:length(vec)
    point = vec(i,:);
    mat = vec-point;
    % Calculate diagonal values of the matrix product
    % Note that sum(mat.*mat,2) might be a bit faster. You can try yourself.
    tmp = diag(mat*mat');
    if (length(find(tmp == 1)) == 4)
        % If we find 4 values of 1 in tmp, the point is surrounded
        % E.g., remove the value here if you wish
        point
    end
end

编辑:另外,请注意,如果向量中有重复点,这将无法正常工作。

【讨论】:

    猜你喜欢
    • 2016-09-04
    • 1970-01-01
    • 2011-03-20
    • 2021-03-19
    • 1970-01-01
    • 2018-07-09
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多