2017-06-02 4 views
0

"n"で自然数を持つ行列を作成し、列と行の合計が等しくなければならない関数を作成する必要があります。ファンクション - 等しい和の行を持たない行列

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: 機能f(n, s)は、2つの引数を持つべきですカラム。私はコードを改善する助けが必要です。私はあなたの助けに最も感謝しています!

    +2

    > N、(それなし問題は難治性である) 'DIAG(N)*(SN)+ 1 'ありませんあなたが尋ねたこと。 – Miff

    +0

    s> nの場合、Miffの非常に短い答えが働きますが、s = nなら問題は解決できます。 if(n == s){matrix(1、nrow = n、ncol = n)} else {diag(n)*(s-n)+1} 'を実行できます。または、自然数であるためにゼロをとるならば、 'diag(s)'だけです。 – user1310503

    答えて

    0

    いうだけで、対角行列よりも、1つのアプローチは次のようになり、あなたの建設にいくつかのランダム性を必要と仮定すると:(私は他の人、自然数は1から始まると仮定している可能な最小の値を持つ

    1. 初期化行列このサブセット内のエントリのいずれかを選択し、それをもう行までステップ2および3に
    2. キャリーをインクリメント所望和
    3. 未満で行と列を特定
    4. )0から始まるように定義列がthより小さい所望の合計。

    あなたはと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 
    } 
    
    0

    。 1から始まる自然数を考慮すると、行列には​​ゼロは必要なく、s> nである必要があります。 このコードは、iの1回の反復で行全体(i行)と列全体(i列)の乱数を生成する行列をスキャンします。 Nの任意の値のためにそれを試してみて、条件(S> N)sは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 
    
    +0

    どうもありがとうございます。とても役に立ちます!しかし、それは負の値を返します、私は自分のコードで同じ問題を抱えていました。私は自然の数に条件を含める方法をまだ知らなかった。 –

    関連する問題