【问题标题】:R fill up matrix according to conditionsR根据条件填充矩阵
【发布时间】:2018-04-19 11:57:57
【问题描述】:

有一个 5x5 的矩阵,其中给出了行和列和

mat1<-matrix(0,ncol = 5, nrow = 5)
colnames(mat1) <- c("A","B","C","D","E")
rownames(mat1) <- c(1:5)
mat1<-rbind(mat1, Sum = 2)
mat1<-cbind(mat1, Sum = c(1,3,2,3,1,""))
View(mat1)

行和列的总和意味着,不能用 1 填充超过总和的单元格。 矩阵必须被填充,以尽可能满足条件(每个矩阵元素的行和和列和)。
但是每一行的单元格必须在定义的区间内填满:

mat2[1,]<-c(1,1,0,0,0)
mat2[2,]<-c(1,1,1,1,0)
mat2[3,]<-c(0,1,1,0,0)
mat2[4,]<-c(0,1,1,1,1)
mat2[5,]<-c(0,0,0,1,1)
mat2<-rbind(mat2, Sum = 2)
mat2<-cbind(mat2, Sum = c(1,3,2,3,1,"")) 
View(mat2)

因此,我想收到以下矩阵:

换一种说法,矩阵只能在区间内被填满,在下面的矩阵中红色被填满:

提前谢谢你!

【问题讨论】:

    标签: r matrix conditional-statements fill


    【解决方案1】:

    解决您的问题的方法不止一种。请参阅使用Patefield's algorithm 的这段代码(每次运行它都会有不同的解决方案,这里我给出了 3 个不同的示例):

    mat1 <- r2dtable(n=1, r=c(1,3,2,3,1), c=rep(2,5))[[1]]
    
    colnames(mat1) <- c("A","B","C","D","E")
    rownames(mat1) <- c(1:5)
    mat1 <- rbind(mat1, Sum = 2)
    mat1 <- cbind(mat1, Sum = c(1,3,2,3,1,""))
    
    mat1
    
         A   B   C   D   E   Sum
    1   "0" "1" "0" "0" "0" "1"
    2   "1" "0" "0" "1" "1" "3"
    3   "0" "0" "1" "1" "0" "2"
    4   "0" "1" "1" "0" "1" "3"
    5   "1" "0" "0" "0" "0" "1"
    Sum "2" "2" "2" "2" "2" ""
    

         A   B   C   D   E   Sum
    1   "0" "0" "0" "0" "1" "1"
    2   "2" "0" "1" "0" "0" "3"
    3   "0" "0" "1" "1" "0" "2"
    4   "0" "1" "0" "1" "1" "3"
    5   "0" "1" "0" "0" "0" "1"
    Sum "2" "2" "2" "2" "2" ""
    

         A   B   C   D   E   Sum
    1   "0" "0" "0" "1" "0" "1"
    2   "0" "1" "1" "0" "1" "3"
    3   "0" "1" "0" "0" "1" "2"
    4   "1" "0" "1" "1" "0" "3"
    5   "1" "0" "0" "0" "0" "1"
    Sum "2" "2" "2" "2" "2" ""
    

    【讨论】:

    • 感谢您的回答!我曾经说过,每一行的单元格必须在定义的间隔内填充,这些间隔在 mat2 中填充了 1 个。而且每一行都要按从上到下、从左到右的顺序填满。
    • 我不确定我是否正确理解了您的问题。但是由于您似乎有很多条件,最简单的解决方案可能是使用 for 循环。
    猜你喜欢
    • 2014-03-22
    • 1970-01-01
    • 2021-07-29
    • 2012-12-04
    • 2018-12-17
    • 2018-01-23
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多