我正在尝试编写一个代码来查找矩阵是否是R中的魔术矩阵?

时间:2017-12-29 17:04:05

标签: 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_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)

    } 
  }
 }

2 个答案:

答案 0 :(得分:1)

根据Wikipedia

  

魔方是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

答案 1 :(得分:0)

R中的索引从1开始:

替换

test_dim[0] == test_dim[1]

通过

test_dim[1] == test_dim[2]

也替换 nrow[test]ncol[test] nrow(test)ncol(test)