【问题标题】:Function - matrix with equal sum rows nad columns函数 - 行和列总和相等的矩阵
【发布时间】:2017-06-02 06:28:50
【问题描述】:

我必须创建一个函数,该函数使用自然数创建一个“n”乘“n”矩阵,并且列和行的总和必须相等。 函数f(n, s) 应该有 2 个参数:

  • n - 维度
  • s - 总和

我对这个问题有部分解决方案:

n<-3
s<-20
m<-matrix(rep(0,n^2),n)

for (c in 1:n){
    for (r in 1:n){
        if (r==n) m[r,c]<-s-sum(m[1:r-1,c])
        else{
           m[r,c]<-round(runif(1,1,s-(n-1)-sum(m[1:r,c])))
           print (sum(m[1:r,c]))
        }
    }
}

m

总和仅对列相等。我需要帮助来改进我的代码。非常感谢您的帮助!

【问题讨论】:

  • 假设 s>n,(没有这个问题是棘手的)diag(n)*(s-n)+1 做你问的。
  • Miff 非常简短的答案在 s > n 时有效,但如果 s = n 则问题可以解决。你可以做if (n == s) { matrix(1, nrow=n, ncol=n) } else { diag(n)*(s-n)+1 }。或者,如果您将零作为自然数,则只需 diag(s)。

标签: r function matrix


【解决方案1】:

假设您希望在构造中具有一些随机性,而不仅仅是对角矩阵,一种方法是:

  1. 用最小的可能值初始化矩阵(我假设自然数从 1 开始,其他人将它们定义为从 0 开始)
  2. 识别小于所需总和的行和列
  3. 选择此子集中的一个条目并将其递增
  4. 继续执行第 2 步和第 3 步,直到没有更多的行和列小于所需的总和。

您可以在 R 中将其实现为:

n<-3
s<-20

d <- matrix(1, n, n) #or 0 if you prefer

while (sum(d)<s*n) {
  rows <- which(colSums(d)<s)
  cols <- which(rowSums(d)<s)
  r <- sample(rows,1)
  c <- sample(cols,1)
  d[r,c] <- d[r,c] + 1
}

【讨论】:

    【解决方案2】:

    这可能会对您有所帮助。 考虑从 1 开始的自然数,并且矩阵中不需要零并且 s>n。 此代码将扫描矩阵,在 i 的单次迭代中为整行(第 i 行)和整列(第 i 列)生成随机数。 尝试任何 n 和 s 的值 condition (s>n)

    n<-3
    s<-20
    m<-matrix(0,nrow=n, ncol=n)
    for(i in 1:n){
        for(k in i:n){
            if(k==i){       
                if(k==n){       #diagonal and last element of matrix
                    m[i,k]<-s-sum(m[k, 1:k])
                }
                else{           #diagonal element
                    m[i, k]<-round(runif(1,1, s-max(sum(m[k, 1:k]),sum(m[1:k, k]))-(n-k)))
                }
            }
            else{
                if(k==n){       
                    m[k, i]<-s-sum(m[1:k, i]) #NOT diagonal but nth element. i.e row=n
                    m[i, k]<-s-sum(m[i, 1:k]) #NOT diagonal but nth element. i.e col=n
                }
                else{           #any other element in matrix
                    m[k, i]<-round(runif(1,1, s-max(sum(m[k, 1:i]),sum(m[1:k, i]))-(n-k)))  #i = col
                    m[i, k]<-round(runif(1,1, s-max(sum(m[i, 1:k]),sum(m[1:i, k]))-(n-k)))  #i = row
                }
            }
        }
    }
    m
    

    【讨论】:

    • 非常感谢,很有帮助!但它返回负值,我的代码也有同样的问题;我没有而且仍然不知道如何包含自然数的条件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多