如何根据行和列的总数获得所有可能的电池频率组合

时间:2019-06-29 14:28:35

标签: r

我必须总计一个表的行和列的总数。在示例中为31、92、59和64。每个单元格也可以得到示例中指示的最大值(例如:单元格1的最大值为20,依此类推)。

示例:

enter image description here

如何在R中对其进行编码?我尝试了重复循环,但没有成功!

1 个答案:

答案 0 :(得分:1)

您的表格如下:

a   b  | sab
c   d  | scd
----------
sac sbd| S

,您有4个约束的4个未知数(暂时忘记a,b,c和d的最大约束):

a + b = sab

a + c = sac

c + d = scd

b + d = sbd

这四个约束不是独立的(否则,您将只有一个可能的解决方案!),并且 一点代数表明,该线性系统的矩阵的秩为3。所以您有一个度数 玩的自由。以a为例,然后将a从0更改为最大值。对于每个值 然后使用行和列总和约束计算b,c和d,并检查它们是否满足 积极性和最大约束条件。

您的示例的R代码如下:

sab <- 59
scd <- 64
sac <- 31
sbd <- sab + scd - sac ### this is always true

amax <-  20
bmax <- 40
cmax <- 12
dmax <- 70

### let us vary a, our only degree of freedom
for (a in 0:amax){
    ### let us compute b, c and d by satisfying row and column sum constraints
    b <- sab - a
    c <- sac - a
    d <-  sbd - b
    ### let us check inequality constraints
    if (b <= bmax && b>= 0 && c <= cmax && c >= 0 && d <= dmax && d >= 0){
        cat("\nSolution:\n")
        print(m <- rbind(c(a,b),c(c,d)))
        cat("\nrowSums:", rowSums(m))
        cat("\ncolsums:", colSums(m))
        cat("\n---------------\n")
        if (! identical(rowSums(m), c(sab,scd)))
            stop("\nrow sum is not right!\n")
        if (! identical(colSums(m), c(sac,sbd)))
            stop("\ncolumns sum is not right!\n")
    }
}
相关问题