R中的Hilbert矩阵函数

hmtdttj4  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(107)


的数据
我试图创建一个函数hilbert_matrix,它计算hilbert_matrix的维数等于:dim_mat,其中dim_mat是正整数。
有谁能解释一下为什么当我尝试

hilbert_matrix(10).

字符串
下面是我的代码:

hilbert_matrix <- function(dim_mat) {
  if (!is.numeric(dim_mat) || length(dim_mat) != 1 || dim_mat <= 0 || !is.integer(dim_mat)) {
    return(NULL)
  }
  
  hilbert <- matrix(0, nrow = dim_mat, ncol = dim_mat)
  
  for (i in 1:dim_mat) {
    for (j in 1:dim_mat) {
      hilbert[i, j] <- 1 / (i + j - 1)
    }
  }
  
  return(hilbert)
}


提前感谢您

a8jjtwal

a8jjtwal1#

返回NULL是因为10不是整数。注意,在if语句中,有一个条件!is.integer(dim_mat),它的计算结果是TRUE,因此返回NULL来使用你的函数,考虑只传递整数:

hilbert_matrix(3)
NULL

hilbert_matrix(3L) # Appending `L` to 3
          [,1]      [,2]      [,3]
[1,] 1.0000000 0.5000000 0.3333333
[2,] 0.5000000 0.3333333 0.2500000
[3,] 0.3333333 0.2500000 0.2000000

hilbert_matrix(as.integer(3)) # explicit coercing to integer
          [,1]      [,2]      [,3]
[1,] 1.0000000 0.5000000 0.3333333
[2,] 0.5000000 0.3333333 0.2500000
[3,] 0.3333333 0.2500000 0.2000000

字符串
检查数字是否为整数的最佳方法是as.integer(x) == xfloor(x) == x等,而不是直接检查is.integer(x)
无论你做什么,都相当于:

hilbert_mat2 <- function(dim_mat){
 if(!is.numeric(dim_mat) | length(dim_mat) != 1 | dim_mat <= 0 | floor(dim_mat) != dim_mat) return (NULL)
 dm <- c(dim_mat, dim_mat)
 1/(.col(dm) + .row(dm))
}


hilbert_mat2(3)
          [,1]      [,2]      [,3]
[1,] 0.5000000 0.3333333 0.2500000
[2,] 0.3333333 0.2500000 0.2000000
[3,] 0.2500000 0.2000000 0.1666667

3htmauhk

3htmauhk2#

@Onyambu已经解释了你得到NULL的原因,所以没有必要在这里再次讨论它,但下面的代码只是Hilbert矩阵的另一个较短的实现。
试试outer

hilbert_matrix <- function(n) 1 / (outer(1:n, 1:n, `+`) - 1)

字符串
你会得到,例如,

> hilbert_matrix(3)
          [,1]      [,2]      [,3]
[1,] 1.0000000 0.5000000 0.3333333
[2,] 0.5000000 0.3333333 0.2500000
[3,] 0.3333333 0.2500000 0.2000000

> hilbert_matrix(5)
          [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 1.0000000 0.5000000 0.3333333 0.2500000 0.2000000
[2,] 0.5000000 0.3333333 0.2500000 0.2000000 0.1666667
[3,] 0.3333333 0.2500000 0.2000000 0.1666667 0.1428571
[4,] 0.2500000 0.2000000 0.1666667 0.1428571 0.1250000
[5,] 0.2000000 0.1666667 0.1428571 0.1250000 0.1111111

相关问题