Подсчет коробок в R - PullRequest
       26

Подсчет коробок в R

1 голос
/ 16 октября 2019

Я пытаюсь использовать счетчик ячеек в R для вычисления фрактальной размерности объекта, представленного двоичной матрицей (матрица 512 x 512, полностью заполненная единицами и 0). Естественно, я нашел этот вопрос, но вопрос не похож на мой, и ответ является тусклым. Я сам не знаком с математическими деталями подсчета ящиков, но знаком с его полезностью при расчете фрактальной размерности. Тем не менее, большая часть документации, лежащей в основе некоторых функций в R, претендующих на вычисление измерения подсчета ящиков, объясняется способами, которые мне не нравятся (из того, что я читал в Интернете, я не единственный). Мне любопытно, имел ли кто-либо на этом сайте опыт работы с этими программами, и могли бы они поделиться своей мудростью?

Редактировать

Данные, которые я пытаюсь проанализировать, представлены в виде двоичной матрицы, единственными ненулевыми элементами являются 1. Пример такой матрицы следующий:

A = matrix(c(0,0,0,0,0,0,1,0,0,1,1,0,0,1,1,1),byrow=T,nrow=4,ncol=4)

Я спрашиваю только о квадратных матрицах. Хотя эта матрица мала, матрицы, с которыми я имею дело, намного больше (512x512, как указано ранее). Идеальная функция будет принимать в качестве входных данных матрицу, аналогичную приведенной выше, и выводить размерность счетчика для фигуры, содержащейся в указанной матрице.

1 Ответ

2 голосов
/ 16 октября 2019

Этот код должен работать:

# create a dataset to calculate de Hausdorff-Besicovitch dimension
mat <- matrix(runif(512*512),nrow = 512,ncol = 512)

mat[mat<=0.5] <- 0
mat[mat>0.5] <- 1

cant <- sum(mat)

fragment <- rep(2,10)**(0:9)
Table <- data.frame(Delta = rep(512,10)/(fragment ), N = fragment**2)
Table$LogDelta <- log(Table$Delta)

for(i in 2:10){
  delta_aux <- Table$Delta[i]

  for(j in 1:fragment [i]){
    row_id <- ((j-1)*delta_aux+1):(j*delta_aux)
    for(k in 1:fragment [i]){
      col_id <- ((k-1)*delta_aux+1):(k*delta_aux)
      if(sum(mat[row_id,col_id]) == 0){
        Table$N[i] <- Table$N[i] - 1
      }
    }
  }
}

Table$LogN <- log(Table$N)
lm_dim <- lm(Table$LogN ~ Table$LogDelta)

plot(Table$LogN ~ Table$LogDelta)
abline(lm_dim)

print('The box-counting dimension is:')
print(-lm_dim$coefficients[2])

# without the borders
Table <- Table[2:nrow(Table),]
lm_dim <- lm(Table$LogN ~ Table$LogDelta)

plot(Table$LogN ~ Table$LogDelta)
abline(lm_dim)

print('The box-counting dimension is:')
print(-lm_dim$coefficients[2])

Обратите внимание, что этот код сделан только для матриц 512X512, для разных размеров вам придется его изменить. Кроме того, вы можете выполнить линейную подгонку без двух границ, поскольку это приведет к ошибке в размерах.

...