Для некоторой матрицы 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
теперь у вас есть фрейм данных строки, столбца, расстояния до центра и внутреннего элемента:
> 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 ++ намного быстрее.