【发布时间】: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 的矩阵效率低下。我很确定无论是完整矩阵还是稀疏矩阵都比您当前存储数据的方式更有效。