首页 > 解决方案 > R:从矩阵中提取一个圆

问题描述

给定一个边长为 L 的方阵,如何在 R 中提取落入能够填充矩阵的最大可能圆的所有值?

在此处输入图像描述

我在 C++的矩阵(二维数组)中找到了填充圆,但是如何测试矩阵的每个单元格的位置是否落入等式?以apply为例,如何知道每个单元格的X和Y?

标签: rmatrix

解决方案


对于一些 8x8 矩阵m

m = matrix(1:64,8,8)

创建坐标的数据框:

g = expand.grid(1:nrow(m), 1:nrow(m))

计算到中心的距离:

g$d2 = sqrt ((g$Var1-4.5)^2 + (g$Var2-4.5)^2)

与圆半径比较:

g$inside = g$d2<=4

你现在有一个行、列、到中心的距离和 is-it-inside 的数据框:

> head(g)
  Var1 Var2       d2 inside
1    1    1 4.949747  FALSE
2    2    1 4.301163  FALSE
3    3    1 3.807887   TRUE
4    4    1 3.535534   TRUE
5    5    1 3.535534   TRUE

然后,您可以通过两列矩阵从矩阵中提取:

m[as.matrix(g[g$inside,c("Var1","Var2")])]
[1]  3  4  5  6 10 11 12 13 14 15 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
[26] 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 50 51 52 53 54 55 59 60
[51] 61 62

从您的图像中应该是 64 减去 12(每个角三个)单元格,所以我的答案中 52 的长度看起来是正确的。

如果您正在寻找速度,请跳过平方根并与距离平方 16 进行比较。但是您可能会更快地找到 C++ 中的解决方案。


推荐阅读