Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 函数-行和列相等的矩阵_R_Function_Matrix - Fatal编程技术网

R 函数-行和列相等的矩阵

R 函数-行和列相等的矩阵,r,function,matrix,R,Function,Matrix,我必须创建一个函数,用自然数创建一个“n”乘“n”的矩阵,列和行的总和必须相等。 函数f(n,s)应该有两个参数: 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]<-r

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

  • 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

n假设在构造中需要一些随机性,而不仅仅是对角线矩阵,一种方法是:

  • 用最小的可能值初始化矩阵(我假设自然数从1开始,其他人定义为从零开始)
  • 标识小于所需总和的行和列
  • 选择此子集中的一个条目并将其递增
  • 执行步骤2。三,。直到没有更多的行和列小于所需的总和
  • 您可以在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
    }
    
    n这可能会对您有所帮助。
    考虑从1开始的自然数,矩阵中不需要零,s>n。
    该代码将扫描矩阵,在i的单个迭代中生成整行(第i行)和整列(第i列)的随机数。
    在n和s条件(s>n)


    nasuming s>n(没有它,问题就很难解决)
    diag(n)*(s-n)+1
    按照你的要求去做。如果s>n,Miff非常简短的回答是有效的,但是如果s=n,问题就可以解决。如果(n==s){matrix(1,nrow=n,ncol=n)}或者{diag(n)*(s-n)+1},则可以执行
    。或者,如果你把零作为一个自然数,只需
    diag(s)
    。非常感谢,这非常有帮助!但是它返回负值,我的代码也有同样的问题;我以前没有,现在仍然不知道如何涉及自然数的条件。
    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