函数 - 具有相等和行nad列的矩阵

时间:2017-06-02 06:28:51

标签: r function matrix

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

  • n - 维度
  • s - sum

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

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

总和仅等于列。我需要帮助改进我的代码。我非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

假设您想要在构造中使用一些随机性,而不仅仅是对角矩阵,那么一种方法就是:

  1. 初始化具有最小可能值的矩阵(我假设自然数从1开始,其他人将它们定义为从零开始)
  2. 识别小于所需总和的行和列
  3. 选择此子集中的一个条目并将其递增
  4. 继续执行步骤2.和3.直到没有更多的行和列小于所需的总和。
  5. 你可以在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
    }
    

答案 1 :(得分:0)

这可能会对你有所帮助。 考虑从1开始的自然数,你的矩阵和s&gt; n中不需要零。 此代码将扫描矩阵,在i的单次迭代中生成整行(第i行)和整列(第i列)的随机数。 尝试使用n和s 条件(s&gt; 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