R中的盒数

问题描述 投票:1回答:1

我正在尝试在R中使用盒计数来计算由二进制矩阵(一个由1和0组成的512 x 512矩阵)表示的对象的分形维数。自然地,我发现了this问题,但是这个问题与我的问题不相似,答案是平淡无奇的。我对框算的数学细节并不熟悉,但对分形维数的计算却很熟悉。话虽这么说,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)。理想函数将上面的矩阵作为输入,并输出包含在所述矩阵中的图形的盒算尺寸。

r fractals
1个回答
1
投票

此代码应该起作用:

# 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])

注意,此代码仅对512X512的矩阵完成,对于不同的尺寸,您将不得不对其进行更改。另外,您可能希望不使用两个边界进行线性拟合,因为这会给您尺寸带来误差。

© www.soinside.com 2019 - 2024. All rights reserved.