I';我想写一个代码,看看矩阵是不是R中的魔法矩阵?

I';我想写一个代码,看看矩阵是不是R中的魔法矩阵?,r,matrix,R,Matrix,这是我到目前为止的代码,但它不会返回任何东西,我不明白为什么。谢谢你的帮助 is_magic <- function(test){ test <- matrix(test) test_dim <- dim(test) if (test_dim[1] == test_dim[2]){ test_diag <- diag(test) diag_sum <- sum(test_diag) row_su

这是我到目前为止的代码,但它不会返回任何东西,我不明白为什么。谢谢你的帮助

is_magic <- function(test){
    test <- matrix(test)
    test_dim <- dim(test)
    if (test_dim[1] == test_dim[2]){
        test_diag <- diag(test)
        diag_sum <- sum(test_diag)
        row_sum <- rowsum(test, nrow(test))
        col_sum <- colsum(test, ncol(test))
        if ((row_sum == col_sum) && (col_sum == diag_sum)){
               return (True)
        } else {
            return (False)

    } 
  }
 }

R中的索引从1开始:

替换

test_dim[0] == test_dim[1]

也代替
nrow[test]
ncol[test]
nrow(test)
ncol(test)
根据

幻方是一个n×n的方格(其中n是 每侧的细胞)中充满不同的正整数 范围1,2,…,n^2,使每个单元格包含不同的整数 每行、每列和每对角线中的整数之和相等

您的代码中仍然存在一些缺陷。我建议将矩阵传递给函数,而不是在函数内部使用
matrix
,也不要使用
rowSums
/
colSums
。此外,R区分大小写,布尔值是
TRUE
/
FALSE
,而不是
TRUE
/
FALSE

所以也许可以试试

is_magic <- function(test) {
  if (ncol(test) == nrow(test)) { 
    if (length(unique(test))==length(test) && all(test>0)) {
      diag_sum <- sum(diag(test))
      antidiag_sum <- sum(diag(test[,ncol(test):1]))
      row_sum <- rowSums(test)
      col_sum <- colSums(test)
      if (all(row_sum == col_sum) && col_sum[1] == diag_sum && diag_sum == antidiag_sum){
        return (TRUE)
      }
    }
  }
  return(FALSE)
}
is_magic(m<-matrix(c(2,9,4,7,5,3,6,1,8), 3))
# [1] TRUE
is_magic(matrix(c(1,9,4,7,5,3,6,1,8), 3))
# [1] FALSE
is_magic(0)){

diag_dim谢谢,我做了这些调整,但它仍然没有返回任何内容。@user4343563请注意,如果(test_dim[1]==test_dim[2])为false,则您不会返回任何内容。添加另一个返回(false)如果这不是真的,我最初在结尾处有另一个else语句,但后来我不断得到一个意外的elsedo错误。你还需要检查“other”对角线(从右到左,从上到下)?
is_magic <- function(test) {
  if (ncol(test) == nrow(test)) { 
    if (length(unique(test))==length(test) && all(test>0)) {
      diag_sum <- sum(diag(test))
      antidiag_sum <- sum(diag(test[,ncol(test):1]))
      row_sum <- rowSums(test)
      col_sum <- colSums(test)
      if (all(row_sum == col_sum) && col_sum[1] == diag_sum && diag_sum == antidiag_sum){
        return (TRUE)
      }
    }
  }
  return(FALSE)
}
is_magic(m<-matrix(c(2,9,4,7,5,3,6,1,8), 3))
# [1] TRUE
is_magic(matrix(c(1,9,4,7,5,3,6,1,8), 3))
# [1] FALSE